extracting 2D array from 4D array in matlab [duplicate] - arrays

This question already has answers here:
How do I get the two last dimensions of an N-D array as a 2D array?
(3 answers)
Closed 7 years ago.
I have a 4D array in matlab something like this,
test(:,:,1,1) =
0
test(:,:,2,1) =
0
test(:,:,3,1) =
0
test(:,:,4,1) =
0
test(:,:,5,1) =
0
test(:,:,1,2) =
0
test(:,:,2,2) =
0
test(:,:,3,2) =
0
test(:,:,4,2) =
0
test(:,:,5,2) =
0
test(:,:,1,3) =
0
test(:,:,2,3) =
0
test(:,:,3,3) =
0
test(:,:,4,3) =
0
test(:,:,5,3) =
0
test(:,:,1,4) =
0
test(:,:,2,4) =
0
test(:,:,3,4) =
0
test(:,:,4,4) =
0
test(:,:,5,4) =
0
test(:,:,1,5) =
0
test(:,:,2,5) =
0
test(:,:,3,5) =
0
test(:,:,4,5) =
0
test(:,:,5,5) =
0
K>> test
test(:,:,1,1) =
0
test(:,:,2,1) =
0
test(:,:,3,1) =
0
test(:,:,4,1) =
0
test(:,:,5,1) =
0
test(:,:,1,2) =
0
test(:,:,2,2) =
0
test(:,:,3,2) =
0
test(:,:,4,2) =
0
test(:,:,5,2) =
0
test(:,:,1,3) =
0
test(:,:,2,3) =
0
test(:,:,3,3) =
0
test(:,:,4,3) =
0
test(:,:,5,3) =
0
test(:,:,1,4) =
0
test(:,:,2,4) =
0
test(:,:,3,4) =
0
test(:,:,4,4) =
0
test(:,:,5,4) =
0
test(:,:,1,5) =
0
test(:,:,2,5) =
0
test(:,:,3,5) =
0
test(:,:,4,5) =
0
test(:,:,5,5) =
0
Now I want to get an array, something like this
ans =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
Is there a simple way to convert the dimentions.
I am very much new to multidimensional arrays in Matlab.
Please let me know if anyone knows of any solution.

Use the squeeze function, it will return a matrix of size [5 4] when you input a matrix of size [1 1 5 4]

Related

Getting memory Address like values of my array when printing (C programming)

I am trying to create 8x8 array, but when I am printing that array, after [7][7] Element I am not getting the exact values that I assigned while creating the array.
My array is a follows
#include <stdio.h>
int main() {
int puzzle[8][8] = {
// 0 1 2 3 4 5 6 7 8
{0,0,2,0,4,0,5,9,3},//0
{7,0,0,3,1,0,4,0,8},//1
{4,0,0,8,0,5,1,0,2},//2
{8,3,0,2,0,0,0,0,0},//3
{0,9,6,0,0,0,3,5,0},//4
{0,0,0,0,0,4,0,8,6},//5
{3,0,1,5,0,9,0,0,7},//6
{6,0,5,0,2,8,0,0,1},//7
{0,4,0,0,7,0,6,0,0} //8
};
for (int i = 0; i < 9; ++i)
{
for (int j = 0; j < 9; ++j)
{
printf("\n puzzle[%d][%d] = %d",i,j,puzzle[i][j]);
}
}
return 0;
}
and I am getting output as
puzzle[0][0] = 0
puzzle[0][1] = 0
puzzle[0][2] = 2
puzzle[0][3] = 0
puzzle[0][4] = 4
puzzle[0][5] = 0
puzzle[0][6] = 5
puzzle[0][7] = 9
puzzle[0][8] = 7
puzzle[1][0] = 7
puzzle[1][1] = 0
puzzle[1][2] = 0
puzzle[1][3] = 3
puzzle[1][4] = 1
puzzle[1][5] = 0
puzzle[1][6] = 4
puzzle[1][7] = 0
puzzle[1][8] = 4
puzzle[2][0] = 4
puzzle[2][1] = 0
puzzle[2][2] = 0
puzzle[2][3] = 8
puzzle[2][4] = 0
puzzle[2][5] = 5
puzzle[2][6] = 1
puzzle[2][7] = 0
puzzle[2][8] = 8
puzzle[3][0] = 8
puzzle[3][1] = 3
puzzle[3][2] = 0
puzzle[3][3] = 2
puzzle[3][4] = 0
puzzle[3][5] = 0
puzzle[3][6] = 0
puzzle[3][7] = 0
puzzle[3][8] = 0
puzzle[4][0] = 0
puzzle[4][1] = 9
puzzle[4][2] = 6
puzzle[4][3] = 0
puzzle[4][4] = 0
puzzle[4][5] = 0
puzzle[4][6] = 3
puzzle[4][7] = 5
puzzle[4][8] = 0
puzzle[5][0] = 0
puzzle[5][1] = 0
puzzle[5][2] = 0
puzzle[5][3] = 0
puzzle[5][4] = 0
puzzle[5][5] = 4
puzzle[5][6] = 0
puzzle[5][7] = 8
puzzle[5][8] = 3
puzzle[6][0] = 3
puzzle[6][1] = 0
puzzle[6][2] = 1
puzzle[6][3] = 5
puzzle[6][4] = 0
puzzle[6][5] = 9
puzzle[6][6] = 0
puzzle[6][7] = 0
puzzle[6][8] = 6
puzzle[7][0] = 6
puzzle[7][1] = 0
puzzle[7][2] = 5
puzzle[7][3] = 0
puzzle[7][4] = 2
puzzle[7][5] = 8
puzzle[7][6] = 0
puzzle[7][7] = 0
puzzle[7][8] = -445142480
puzzle[8][0] = -445142480
puzzle[8][1] = 32765
puzzle[8][2] = 480800256
puzzle[8][3] = -129200335
puzzle[8][4] = 0
puzzle[8][5] = 0
puzzle[8][6] = -2108403533
puzzle[8][7] = 32522
puzzle[8][8] = -2106304992
As you can see I am not getting exact values that I assigned to [7][8]th position.
The output I am getting looks like address or ids. I am not getting why it is happening, is it ide problem or is there any mistake in my code?
As you already seem to understand, array elements are indexed beginning at position zero. So when you define an array of size n arr[n], you can only hold n elements(0 to n - 1) in this array. Same applies for multi-dimensional arrays.
In your case you have only defined an array of size 8x8 which can hold only 64 elements. But you are trying to assign 9x9 81 elements to your array. Thus, only indices puzzle[0][0] to puzzle[7][7] are accessible.
The compiler shall issue a message for this initialization
int puzzle[8][8] = {
// 0 1 2 3 4 5 6 7 8
{0,0,2,0,4,0,5,9,3},//0
{7,0,0,3,1,0,4,0,8},//1
{4,0,0,8,0,5,1,0,2},//2
{8,3,0,2,0,0,0,0,0},//3
{0,9,6,0,0,0,3,5,0},//4
{0,0,0,0,0,4,0,8,6},//5
{3,0,1,5,0,9,0,0,7},//6
{6,0,5,0,2,8,0,0,1},//7
{0,4,0,0,7,0,6,0,0} //8
};
because elements of the array are arrays with 8 elements bur you are supplying 9 initializers for each element.
And if an array has N elements then the valid range of indices is [0, N).

Octave error: some elements in list of return values are undefined [duplicate]

This question already has answers here:
Create a zero-filled 2D array with ones at positions indexed by a vector
(4 answers)
Closed 2 years ago.
I'm Building a Matrix With a Generator, I'm try to get value column according with the value in other list_ones
list_ones=[4,3,2,1]
I want my output to be:
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
the code do correctly but it has this wrong: some elements in list of return values are undefined
function y=matrixGenerator(list_ones, size)
List1=[];
Linha=[];
nl = size;
nc = size;
for i = 1:nl
elem=list_ones(i);
for j = 1:nc
if (elem==j)
M(i,j) = 1;
else
M(i,j) = 0;
endif
end
end
M
endfunction
You can achieve the result in two way:
You can use your matrixGenerator method:
function y = matrixGenerator(list_ones)
sz = length(list_ones);
y = zeros(sz, sz);
for i=1:sz
idx = list_ones(i);
y(i, idx) = 1;
end
disp(y)
end
Outptut:
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
or, you can use built-in function:
clear; clc
A = flip(eye(4));
disp(A)
Output:
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
Maybe you can try sub2ind in the function matrixGenerator
function y = matrixGenerator(list_ones)
sz = length(list_ones)*ones(1,2);
y = zeros(sz);
y(sub2ind(sz,1:length(list_ones),list_ones)) = 1;
endfunction
such that
>> matrixGenerator(list_ones)
ans =
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0

Create a matrix blockwise attaching blocks like a stairway MATLAB

I want to build an Array containing of different blocks in the following way.
Given the block I want to repeat the block n-times so that it looks like this:
A =
1 0 0 -1 0 0 0 0 0 1 0 0
0 1 0 0 -1 0 0 0 0 0 1 0
0 0 1 0 0 -1 0 0 0 0 0 1
and I want the Array look like this, n times repeating the scheme:
newArray =
1 0 0 -1 0 0 0 0 0 1 0 0
0 1 0 0 -1 0 0 0 0 0 1 0
0 0 1 0 0 -1 0 0 0 0 0 1
1 0 0 -1 0 0 0 0 0 1 0 0
0 1 0 0 -1 0 0 0 0 0 1 0
0 0 1 0 0 -1 0 0 0 0 0 1
and so on...
With the free space being zeros, since the final array should be a sparse array either way.
How can I repeat and attach the block without using loops?
I'm assuming that the leftward offset of each block with respect to a pure block-diagonal matrix is the number of rows of A, as in your example.
You can build a matrix t that 2D-convolved with A gives the result, as follows:
A = [1 2 3 4; 5 6 7 8]; % data matrix
n = 3; % number of repetitions
[r, c] = size(A);
d = c-r;
t = zeros(r*(n-1)+1, d*(n-1)+1);
t(1:(r*(n-1)+1)*d+r:end) = 1;
result = conv2(t,A);
This gives
A =
1 2 3 4
5 6 7 8
result =
1 2 3 4 0 0 0 0
5 6 7 8 0 0 0 0
0 0 1 2 3 4 0 0
0 0 5 6 7 8 0 0
0 0 0 0 1 2 3 4
0 0 0 0 5 6 7 8
Here is a solution using kron:
n = 5; % number of repetitions
v = 3; % overlapping
s = size(A);
B = A(:,1:s(2)-v)
C = zeros(s(1),s(2)-v);
C(:,end-v+1:end) = A(:,end-v+1:end);
result = kron(eye(n) , B);
result(end,end+v)=0;
result(:,v+1:end) = result(:,v+1:end) + kron(eye(n) , C);
When the matrix size is large you can use sparse matrix:
n = 5;
v = 3;
s = size(A);
B = sparse(A(:,1:s(2)-v));
C = sparse(s(1),s(2)-v);
C(:,end-v+1:end) = A(:,end-v+1:end);
result = kron(eye(n) , B);
result(end,end+v) = 0;
result(:,v+1:end) = result(:,v+1:end) + kron(eye(n) , C);

Storing values from a loop in a function in Matlab

I am writing a function in Matlab to model the length of stay in hospital of stroke patients. I am having difficulty in storing my output values.
Here is my function:
function [] = losdf(age, strokeType, dest)
% function to mdetermine length of stay in hospitaal of stroke patients
% t = time since admission (days);
% age = age of patient;
% strokeType = 1. Haemorhagic, 2. Cerebral Infarction, 3. TIA;
% dest = 5.Death 6.Nursing Home 7. Usual Residence;
alpha1 = 6.63570;
beta1 = -0.03652;
alpha2 = -3.06931;
beta2 = 0.07153;
theta0 = -8.66118;
theta1 = 0.08801;
mu1 = 22.10156;
mu2 = 2.48820;
mu3 = 1.56162;
mu4 = 0;
nu1 = 0;
nu2 = 0;
nu3 = 1.27849;
nu4 = 0;
rho1 = 0;
rho2 = 11.76860;
rho3 = 3.41989;
rho4 = 63.92514;
for t = 1:1:365
p = (exp(-exp(theta0 + (theta1.*age))));
if strokeType == 1
initialstatevec = [1 0 0 0 0 0 0];
elseif strokeType == 2
initialstatevec = [0 1 0 0 0 0 0];
else
initialstatevec = [0 0 (1-p) p 0 0 0];
end
lambda1 = exp(alpha1 + (beta1.*age));
lambda2 = exp(alpha2 + (beta2.*age));
Q = [ -(lambda1+mu1+nu1+rho1) lambda1 0 0 mu1 nu1 rho1;
0 -(lambda2+mu2+nu2+rho2) lambda2 0 mu2 nu2 rho2;
0 0 -(mu3+nu3+rho3) 0 mu3 nu3 rho3;
0 0 0 -(mu4+nu4+rho4) mu4 nu4 rho4;
0 0 0 0 0 0 0;
0 0 0 0 0 0 0;
0 0 0 0 0 0 0];
Pt = expm(t./365.*Q);
Pt = Pt(strokeType, dest);
Ft = sum(initialstatevec.*Pt);
Ft
end
end
Then to run my function I use:
losdf(75,3,7)
I want to plot my values of Ft in a graph from from 0 to 365 days. What is the best way to do this?
Do I need to store the values in an array first and if so what is the best way to do this?
Many ways to do this, one straightforward way is to save each data point to a vector while in the loop and plot that vector after you exit your loop.
...
Ft = zeros(365,1); % Preallocate Ft as a vector of 365 zeros
for t = 1:365
...
Ft(t) = sum(initialstatevec.*Pt); % At index "t", store your output
...
end
plot(1:365,Ft);

Libsvm Index exceeds matrix dimensions

The following libsvm matlab code keeps giving me an Index exceeds matrix dimensions after a few loops. Can anyone help me with where the error might be coming from?
testlabel = [1 1 1 1 1 1 1 1 1 1; 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0];
model = cell(3,1);
for n=1:3
model{n} = svmtrain(completelabel{n}, completefeatureVector{n}, '-b 1 -t 0');
end
numTest=10;
pr = zeros(numTest,2);
for k=1:numTest
for m=1:3
[~,~,p] = svmpredict(testlabel(m, k), featureVectortest{k}, model{m}, '-b 1');
pr(:,k) = p(:,model{m}.Label==m); %# probability of class==k
end
[~,predictedLabel] = max(pr,[],2);
end

Resources