Why am I getting error using extract function in this code? - matlab

Coord=[0 0;12 0;24 0;36 0;12 9;24 9];
Dof=[1 2;3 4;5 6;7 8;9 10;11 12];
Edof=[1 1 2 3 4;2 3 4 5 6;3 5 6 7 8;
4 1 2 9 10;5 9 10 3 4;6 9 10 5 6;
7 9 10 11 12;8 11 12 5 6;9 11 12 7 8];
[Ex,Ey]=coordxtr(Edof,Coord,Dof,2);
K=zeros(12);
F=zeros(12,1); F(6)=-1200;F(11)=400;
ep=[10000 pi];
for i=1:9
Ke=bar2e(Ex(i,:),Ey(i,:),ep);
K=assem(Edof(i,:),K,Ke);
end
bc=[1 0;2 0;8 0];
Q=solveq(K,F,bc);
Ed=extract(Edof,Q);
for i=1:9
N(i)=bar2s(Ex(i,:),Ey(i,:),ep,Ed(i,:));
end
eldraw2(Ex,Ey);
plotpar=[1 3 0];scale=1;
eldisp2(Ex,Ey,Ed,plotpar,scale);
Am getting Error "Error using extract: first argument must be text" while running this code in matlab.
Im trying the code given in a textbook. How to solve this error?

Related

How to set an adjacency matrix?

I have the following
and I would like to translate to an adjacency matrix.
This is how I did it
s=[1 1 2 2 2 3 3 4 4 4 5 5 6 7];
t=[2 3 4 5 3 5 6 5 7 8 6 8 7 8];
w=[3 5 4 7 4 9 8 3 11 8 3 9 8 7];
G=graph(s,t,w);
A=adjacency(G)
Could you please tell me if is it correct?

How can I store a matrix in a row of another matrix? MATLAB

I have a 3D matrix and I want to store each 2D component of this in the row of another 2D matrix which has many rows as the 3rd dimension of the 3D matrix.
How can I do this?
With permute & reshape -
reshape(permute(A,[3 2 1]),size(A,3),[])
Sample run -
>> A
A(:,:,1) =
7 1 7 5
3 4 8 5
9 4 2 6
A(:,:,2) =
7 7 2 4
7 6 5 6
3 2 9 3
A(:,:,3) =
7 7 5 3
3 9 2 8
5 9 2 3
>> reshape(permute(A,[3 2 1]),size(A,3),[])
ans =
7 1 7 5 3 4 8 5 9 4 2 6
7 7 2 4 7 6 5 6 3 2 9 3
7 7 5 3 3 9 2 8 5 9 2 3
If you don't mind a little indexing madness...
You can build a linear index with the appropriate shape, which applied on the original array will give the desired result:
B = A(bsxfun(#plus, (1:L*M:L*M*N).', reshape(bsxfun(#plus, (0:L:L*M-1).', 0:L-1),1,[])));
Example:
>> A = randi(10,2,3,4)-1; %// example array; size 2x3x4
>> A
A(:,:,1) =
5 3 2
9 8 9
A(:,:,2) =
8 7 4
9 8 6
A(:,:,3) =
3 4 8
0 4 4
A(:,:,4) =
2 8 8
4 6 7
Result:
>> B
B =
5 3 2 9 8 9
8 7 4 9 8 6
3 4 8 0 4 4
2 8 8 4 6 7
That is easily done with MATLABs matrix unrolling syntax:
A=ones(N,M,O);
B=zeros(O,N*M);
for ii=1:size(A,3)
aux=A(:,:,ii); % aux is NxM
B(ii,:)=aux(:); % unroll!
end
(note I called O the thing you call N in your pictures)

repmat, the size of matrix or number of use

I have a matrix for which I extract each column and do repmat function for each of them to build another matrix. Since i I have to do this for a large number of vectors(each column of my first matrix) it takes so long(relative to which I expect). If I do this for the whole matrix and then do something to build them, does it takes less time?
Consider this as an example:
A=[1 4 7;2 5 8;3 6 9]
I want to produce these
A1=[1 2 3 1 2 3 1 2 3
1 2 3 1 2 3 1 2 3
1 2 3 1 2 3 1 2 3]
A2=[4 5 6 4 5 6 4 5 6
4 5 6 4 5 6 4 5 6
4 5 6 4 5 6 4 5 6]
A3=[7 8 9 7 8 9 7 8 9
7 8 9 7 8 9 7 8 9
7 8 9 7 8 9 7 8 9]
As an alternative to #thewaywewalk's answer and using kron and repmat:
clear
A=[1 4 7;2 5 8;3 6 9];
B = repmat(kron(A',ones(3,1)),1,3);
A1 = B(1:3,:)
A2 = B(4:6,:)
A3 = B(7:end,:)
Which results in the following:
A1 =
1 2 3 1 2 3 1 2 3
1 2 3 1 2 3 1 2 3
1 2 3 1 2 3 1 2 3
A2 =
4 5 6 4 5 6 4 5 6
4 5 6 4 5 6 4 5 6
4 5 6 4 5 6 4 5 6
A3 =
7 8 9 7 8 9 7 8 9
7 8 9 7 8 9 7 8 9
7 8 9 7 8 9 7 8 9
Or as #Divakar pointed out, it would be advisable to create a single 3D array and store all your data in it (general solution):
n = 3; %// # of times you want to repeat the arrays.
A=[1 4 7;2 5 8;3 6 9];
B = repmat(kron(A',ones(n,1)),1,n);
C = zeros(n,n*size(A,2),3);
C(:,:,1) = B(1:n,:);
C(:,:,2) = B(n+1:2*n,:);
C(:,:,3) = B(2*n+1:end,:);
Try if this fits your needs:
A = [1 4 7;2 5 8;3 6 9];
n = 3; %// size(A,1)
cellArrayOutput = arrayfun(#(x) repmat( A(:,x).',n,n ), 1:size(A,2), 'uni',0)
instead of different variable names, everything is stored in a cell array.
if you insist on different names, I'd recommend to use structs:
A = [1 4 7;2 5 8;3 6 9];
n = 3;
structOutput = struct;
for ii = 1:size(A,2)
structOutput.(['A' num2str(ii)]) = repmat( A(:,ii).', n, n );
end
which gives you:
>> structOutput.A1
ans =
1 2 3 1 2 3 1 2 3
1 2 3 1 2 3 1 2 3
1 2 3 1 2 3 1 2 3
and so on.
I don't expect to much performance plus, you should share your full code for further help.

error in SSA matrix creation

i would like to consider following matlab code
http://www.mathworks.com/matlabcentral/fileexchange/8115-singular-spectrum-analysis-smoother/content/ssa.m
especially part
Step1 : Build trayectory matrix
N=length(x1);
if L>N/2;L=N-L;end
K=N-L+1;
X=zeros(L,K);
for i=1:K
X(1:L,i)=x1(i:L+i-1);
end
but when i test on this data
>> x1=[1;3;2;4;5;6;7;8;9];
>> L=5;
>> N=length(x1);
if L>N/2;L=N-L;end
K=N-L+1;
X=zeros(L,K);
for i=1:K
X(1:L,i)=x1(i:L+i-1);
end
>> X
X =
1 3 2 4 5 6
3 2 4 5 6 7
2 4 5 6 7 8
4 5 6 7 8 9
>>
but it does not seems ok,because there is more data length 6 instead of 5 horizontally,so how can i fix it?how should i make sure that other part is also ok?thanks for helping
EDITED:
code should does following example
x1=[2 1 4 3 6 5 8 7];
>> X=create_matrix1(x1,5)
X =
2 1 4 3 6
1 4 3 6 5
4 3 6 5 8
3 6 5 8 7

How to use answer (from command window) for a code

I have random matrix(A) and I find a result I'd like to use later for my code
A=randint(5,7,[1,9])
ans A =
8 1 2 2 6 7 7
9 3 9 4 1 7 1
2 5 9 9 8 4 3
9 9 5 8 9 6 1
6 9 8 9 7 2 1
How can I now get:
A = [8,1,2,2,6,7,7;9,3,9...7,2,1];
without having to type it myself.
MATLAB has a function for that: MAT2STR
>> A = randi([1,9],[5,7]);
>> mat2str(A)
ans =
[5 5 7 5 3 2 5;5 6 5 3 8 4 1;9 8 8 1 7 9 6;1 5 5 1 8 6 3;3 4 5 8 9 9 5]
This is suitable for use with EVAL
Just thought of another way. Your goal is to have A in your script - right?
You can just paste it as follows:
A = [
8 1 2 2 6 7 7
9 3 9 4 1 7 1
2 5 9 9 8 4 3
9 9 5 8 9 6 1
6 9 8 9 7 2 1
]
(note the square brackets)
It will evaluate to your original matrix.
Make the string yourself:
Str = ['[' sprintf('%i',A(1)) sprintf(',%i',A(2:end)) ']']
Note this string does not contain any ; as in your example. so when you evaluate it you will get a 1x35 vector (instead of the original 5x7matrix)
So easiest way to fix this would be to add after you evaluate the string.
A = reshape(A,5,7)
It will look like
B = [....
B = reshape(B,5,7)