Search All of the Math Forum:
Views expressed in these public forums are not endorsed by
Drexel University or The Math Forum.



Re: double for loop
Posted:
Sep 9, 2013 6:41 AM


On 9/9/2013 5:20 AM, cwc wrote: > Can someone explain to me the mechanics for a double for loop? > > [x,y] = size(z) > > for ii = 1:x; > for jj = 1:y; > > newz = z(ii,jj) > > end > > what is the sequence being played out? A geometric interpretation would be good. >
There is matrix z with x rows and y columns.
The loops scan (traverse) this 2D matrix row by row, top to down.
If you think of a 2D matrix as a page in a book, with 'y' words on each line, and with 'x' lines per page, then it is like reading from top to down. word on line 3 and column 5 is z(3,5)
ii is the current line number, and jj is the current word number on current line number ii.
This is all just for visualization. In memory ofcourse, there is no such thing. All data is stored sequentially (linear) and the code generated by compiler/runtime, sorts out thing for you, so you do not have to worry about indexing.
Matlab uses column major (like Fortran). i.e. the data is stored sequentially by columns: first column data, followed by second column data, etc...
This can have an effect on the algorithm speed. If you scan a matrix rowwise, and the matrix is too large, then you will be jumping from one column to the next in each step, and if each column is too long, then matrix data will be in cache.
This can be less efficient if the data is stored Fortranwise since a cache miss can result requiring memory fetch, which slower than using the data from cache. So sometimes you see code written to scan a matrix updown, left to right
for j = 1:nCols %good for columnwise data (Matlab,Fortran...) for i = 1:nRows z(i,j) end end
vs.
for i = 1:nRows % good for rowwise data (C,C++,pyhton etc...) for j = 1:nCols z(i,j) end end
Nasser



