Building a matrix in a faster way

Hi,
I am trying to build a matrix by giving each array in the matrix the same value in its first column. The value is [0;0;1]. My code look something like this:
yv = 1:-1:-1;
xv = -1:1:1;
for Y = 1:length(yv)
for X = 1:length(xv)
M(:,1,X,Y) = [0;0;1];
end
end
I was wondering if there is more efficient way to give the arrays for length (yv) and (xv) the value [0;0;1] instantly without using the for loop. My matrix in original is much larger than this and I need to make the code as faster to execute the data as possible.
Highly appreciate any help with this.
Best wishes
AA

 Akzeptierte Antwort

Matt J
Matt J am 16 Okt. 2012

2 Stimmen

d=[0;0;1];
M=d(:,1,ones(1,length(xv)), ones(1,length(yv)))

2 Kommentare

Walter Roberson
Walter Roberson am 16 Okt. 2012
Which can also be written as
M = repmat(d, [1, 1, length(xv), length(yv)]);
Matt J
Matt J am 16 Okt. 2012
Yes, although repmat does use mcode containing loops, and therefore can be slow.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Azza
Azza am 17 Okt. 2012

0 Stimmen

Many thanks Matt and Walter for your help. Both your answers are very valuable. The thing with my code is that I need to keep a counter in each line. For example the code with the for loop should look something like this:
for Y = 1:length(yv)
for X = 1:length(xv)
counter = 1;
M(:,counter,X,Y)= [0;0;1];
counter = counter;
M(:,counter,X,Y) = A*Rflip*M(:,1,X,Y)+B;
end
end
Thus, the counter should change from value 1 to 2 accordingly.
I have also replicated the matrix for A, Rflip and B in order to accomodate the M value for the length of arrays of (xv) and (yv) similar to your methods. The original sizes of matrices A and Rflip were 3*3 for each element. So I managed to replicate the matrix to [3 3 3 3] for (xy) and (xv) While for B was 3*1 and I made it into [3 1 3 3]. When I tried to execute the line with the replicated matrices for A, Rflip and B {while excluding the counter} I got this error message:
??? Error using ==> mtimes Input arguments must be 2-D.
So would you kindly help me in giving the length of arrays for (xv) and (xy) the same value of M without using the lengthy for loop method while including the counter?
Best wishes
AA

1 Kommentar

Matt J
Matt J am 17 Okt. 2012
Perhaps. But first Accept-click the answer we gave you and then start a new post for your new question.

Melden Sie sich an, um zu kommentieren.

Kategorien

Tags

Gefragt:

am 16 Okt. 2012

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by