Very slow for loop
Ältere Kommentare anzeigen
Hi, I am new to Matlab, i have more experience with C/C++
I am trying run this simple loop:
x=zeros([10001,10001,2]);
for t=1:2
for z =1:10000
for i =1:10000
x(z,i,t)=i+z+t+2;
end
end
end
x(5,5,1)
But is taking a while..imagine many of then inside a single algorithm. in C++ this loop runs in a few seconds...
Is there any other way to run this loop in Matlab faster???
Sorry if my question is silly, first time running Matlab. I tried some vectorization but for nested loops things get really complicated, especially with different loop sizes.
Thanks
3 Kommentare
Andrew Newell
am 31 Dez. 2011
I'm wondering whether you have forgotten that indexing starts with 1, not 0, in MATLAB. Are you really trying to calculate the following?
x=zeros([10001,10001,2]);
for t=1:2
for z =2:10001
for i =2:10001
x(z,i,t)=i+z+t;
end
end
end
x(5,5,1)
Daniel Shub
am 31 Dez. 2011
Why should that be any faster/slower than 1:10000? The variable x is already intialized to a size that handles either case.
Andrew Newell
am 31 Dez. 2011
The point of my question is that the values in each row and column increase until they suddenly drop to zero at the end. I'm guessing that is not what Rafael intended.
Akzeptierte Antwort
Weitere Antworten (3)
the cyclist
am 1 Jan. 2012
x = bsxfun(@plus,bsxfun(@plus,1:10000,(1:10000)'),permute(1:2,[1 3 2]))+2;
1 Kommentar
Rafael
am 1 Jan. 2012
Andrew Newell
am 31 Dez. 2011
For a problem where the numbers count upward monotonically in each direction, here is a compact and fast solution:
y = repmat(2:10002,10001,1);
x = cat(3,y+y',y+y'+1);
On my computer, your code takes about 25 seconds and mine takes 6 seconds.
2 Kommentare
Rafael
am 31 Dez. 2011
Andrew Newell
am 1 Jan. 2012
I think that you mostly can leave loops in because MATLAB uses just-in-time compiling on loops. However, as far as I know this compiling isn't done on arrays of dimension greater than 2.
Jan
am 1 Jan. 2012
0 Stimmen
If the shown code is your original problem, and not a simplification, I'm in doubt, that it is an efficient approach: You occupy 1.6GB memory with values, which are very easy to calculate dynamically.
Note: The reference "x(z,i,t)" requires two multiplications, while "i+z+t+2" uses 3 additions only.
1 Kommentar
Rafael
am 1 Jan. 2012
Kategorien
Mehr zu Loops and Conditional Statements finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!