# Making a matrix in a loop in MATLAB57

Posted by Doug Hull,

A for loop is used to construct a simple matrix with an underlying pattern. Pre-allocation is addressed in the second half of the video.

Oleg replied on : 1 of 57

I would use:

b = bsxfun(@plus, a, (0:4).');

dhull replied on : 2 of 57

@Oleg,

Thank you, you are right and I can see the advantage to knowing that technique.

I, however, have a hard time internalizing and visualizing that kind of construction. Mentally, it takes me a little longer to figure out what bsxfun does. For small matrices like this, I prefer ease of understanding to terseness of code.

For this case, there is no appreciable performance difference, so it is a matter of taste.

FWIW, I do not make up these cases, virtually everything on this blog comes from user questions. If someone is asking me how to make that matrix, then that tells me they are not ready for bsxfun! I only bring out the more powerful (but harder to understand) techniques for the *advanced* section of this blog.

Thanks,
Doug

ravi replied on : 3 of 57

Hi Doug, great and helpful site here!

Here is the beginning of my code;

r2=1
r1=10
a=[r2:r1];
for r2 = r2:r1
G = r2/3;
end


This is just a simplification of a larger code but for the crux of the matter is, the for loop calculates vectors for sigrad2, but I would like to store each of the results in a matrix – I have watched the video where you build a vector with y = i+rand inside the loop but haven’t been able to extend it to my case.

I would then like to plot each of those rows in the resultant matrix against a

Could you please help me in building that matrix? It seems simple but I can’t figure it out

ravi replied on : 5 of 57

@dhull

Yeah I mentioned that I saw that video although that only builds a 1×10 vector but I’m not sure how to expand that code to a mxn matrix

dhull replied on : 6 of 57

@Ravi,

Add a second loop outside that one that counts across the columns.

Doug

Chris replied on : 7 of 57

I have an array
( -0.2429 -0.4420 -0.4997 -0.3964 -0.1646 0.1209 0.3669 0.4935 0.4606 0.2803 0.0114 -0.2601 -0.4483 -0.4933 -0.3796 -0.1425 0.1420 0.3813 0.4970 0.4520 0.2620 -0.0107 -0.2785 -0.4568 -0.4894 -0.3649 -0.1213 0.1642 0.3986 0.5045 0.4467 0.2452 -0.0330 -0.2973 -0.4642 -0.4821 -0.3461 -0.0984 0.1833 0.4087).

I want to call the first 8 elements and find their average, and the next 8 elements and find their average up till the end and in the process form another array with a reduced 5 elements. e.g (a b c d e)

How do i do this in matlab please?

doug replied on : 8 of 57

@Chris,

You would need to pull out the subsets. A for loop would probably work well.

for i:1:8:whatever
do something
end

MEAN is the function to get the mean.

then storing it in a vector:

count = 0

for i = …
count = count+1;
vec(count) = whatever you save
end

-Doug

Yaacov replied on : 9 of 57

You can use the reshape function to make your array a matrix with 8 columns, then use the mean function to calculate the mean of every row. Finally, transpose (‘) to make it a row column:

A=reshape(A,[],8);
mA=mean(A,1);
mA=mA’;

Monica replied on : 10 of 57

How would I create a 3 by 3 matrix where each element is equal to the square of the sum of its row and column numbers?

Doug replied on : 11 of 57

for r = 1:3; for c=1:3; m(r,c) = (r+c)^2; end; end; disp(m)

4 9 16
9 16 25
16 25 36

manju replied on : 12 of 57

how to create multidimensional array in a single loop statement?? or how to declare multiple arrays??

Pedro replied on : 13 of 57

Sir,

you help me a lot. I have a problem and your loop give me a “light on mind” rs

Thanks a lot !

Good work.

AMIT replied on : 14 of 57

i have two excel files and i am trying to call them in matlab,my aim is to check the value in 1st excel file and accordingly edit second
f=xlsread(‘cbtd.xls’);%/ this file has to be edited later
now i have use two nestd for loops and check a condition that
if g(i)(j)<80 then
f(i)(j)=0

and that excel file named f should be edited

Ingrid replied on : 15 of 57

@AMIT: Why do you want to use two for loops? Have a look at this example:
A=magic(5);% Or the matrix from your first Excel file
hv=(A<20); %All elements that are smaller than 20
B=magic(5)*20 %Or the matrix from your second excel file
B(hv)=0;%Change the values of your second file to 0 for which the condition of the first file is true
Of course at the end you need to write B back to the Excel file :-).

AMIT replied on : 16 of 57

thanks ingrid it worked, now i have another problem , i’ve generated BW image and it has some spots my aim is to calculate area of each spot(white)..

Ingrid replied on : 17 of 57

@AMIT: Have a look at bwarea. Btw. there is always technical support that you can contact.

varinder replied on : 18 of 57

function P = legendre(x,n)

P(1) = 1;

P(2) = x;

P(3) = (3*(x^2)- 1)/2;

P =((2.*(n+1)).* x .*(P(n)) – n.*(P(n-1)))./(n+1);

end

test script:

clear legendre;
x = -1;
P = zeros(1,5);

for i = 3:5
P = legendre(x,i);
end

error:

Attempted to access P(4); index out of bounds because numel(P)=3.

Error in legendre (line 7)
P =((2.*(n+1)).* x .*(P(n)) – n.*(P(n-1)))./(n+1);

Error in new_tb (line 6)
P = legendre(x,i);

madhavi replied on : 19 of 57

hi i need help in finding the average using for loop…
( -0.2429 -0.4420 -0.4997 -0.3964 -0.1646 0.1209 0.3669 0.4935 0.4606 0.2803 0.0114 -0.2601 -0.4483 -0.4933 -0.3796 -0.1425 0.1420 0.3813 0.4970 0.4520 0.2620 -0.0107 -0.2785 -0.4568 -0.4894 -0.3649 -0.1213 0.1642 0.3986 0.5045 0.4467 0.2452 -0.0330 -0.2973 -0.4642 -0.4821 -0.3461 -0.0984 0.1833 0.4087).,in this array of data in first instance it must find average of fist five elements ..2nd time it must find average of (2+3+4+5+6) elements average….third time( 3+4+5+6+7)…like this it must keep on finding average till the end of the array…

Stuart McGarrity replied on : 20 of 57

Must to use a loop? Have you written loops before? What do you have so far for code?

subhendu roy replied on : 21 of 57

sir i need to find 25*5 column(total of 125) of a matrix. using for loop. everytime 1st column will be incremented and so on..please help me to find out.the above video shows error like” Subscript indices must either be real positive integers or logicals.”

satyavratan replied on : 22 of 57

sir. i am dividing a 210*210 image in to several 3*3 matrices and performing few operations inside each 3*3. i have created a 3*3 matrix and i have put for loops for row and column operations. i need to operate the same kind of operations for next 3*3 and so on. help me.

Stuart McGarrity replied on : 23 of 57

Can you paste your code here?

sasi replied on : 24 of 57

Algorithm 1 Confusion operation Input: Images Output: Confused Image
for each row ’i’ in the matrix ’I’ do Generate random vector KR for each column ’j’ in the matrix ’I’ do rowsum=rowsum + I [i] [j] end for rowmod=rowsum % 2 if rowmod == 0 then for each KR do I=right circular shift(I) end for else for each KR do I=left circular shift(I) end for end if end for for each column ’j’ in the matrix ’I’ do Generate random vector KC for each row ’i’ in the matrix ’I’ do colsum=colsum + I [i] [j] end for colmod=colsum % 2 if colmod == 0 then for each KC do Iscr=up circular shift(I) end for else for each KC do Iscr=down circular shift(I) end for end if end for

sasi replied on : 25 of 57

send coding

sachin replied on : 26 of 57

Hello sir, I have equations of motion and i want to form a matrix using these equations by only putting the elements of corresponding function.
As i am new to matlab please guide me how to proceed.
Thanks

Ken replied on : 28 of 57

How can I generate a random square matrix without using any matlab tools?

Stuart McGarrity replied on : 29 of 57

Hi Ken, Do you mean, using MATLAB but not using MATLAB random number functions like rand or randn? If so, can I ask why you would want to do that?

sri replied on : 30 of 57

I want to process image matrix in “for loop” in which first loop should consider the matrix 3* 3 , second loop should consider the matrix 2*2, third loop should consider the matrix 2* 2 and again 3*3 and so on…
i.e.first loop-(1:2,1:3)
second loop-(1:2,4:5)
third loop-(1:2,6:8)
fourth loop-(1:2,9:10) and so on…
Can we able write this as coding in Matlab?

Stuart McGarrity replied on : 31 of 57

Hi Sri, Your first loop iteration has 3 columns, the second 2, the third 3 and the forth 2. Is that correct? So the number of columns is 3 for odd iterations and 2 for even? Or did you make a mistake and it should be 2 each time?

mỹ phẩM Thái Lan replied on : 32 of 57

It kind of feels that you are doing any unique trick.
Moreover, The contents are masterpiece. you’ve done a magnificent job on this subject!

M Haroon replied on : 33 of 57

I want To add Two matrices in a script file how can i do that. ?? while matrices are been created by using the “for” loop , based on user’s requirement to input matrix of any order.

Stuart McGarrity replied on : 34 of 57

What can’t you just use A=B+C ?

site replied on : 35 of 57

Very goоd article! Wе аre linking to thіs gгeat
article ߋn oᥙr site. Keep uр tҺe great writing.

Harshini replied on : 36 of 57

can anybody help me out to how to assign array variable to no. of cropped subimages of a image in a for loop?

Stuart McGarrity replied on : 37 of 57

Hi Harshini, Can you write some example code to start? I’m not sure I understand what you want.

ezgi replied on : 38 of 57

I would like to create 500×500 matrix like that [m1 m2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0…… ………………………………..]
[ 0 0 m3 m4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0…… ……………………………….]
[ 0 0 0 0 m5 m6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0…… …………………………….]..
.. …
This is 500×500 matrix like that and I need a loop to construct this matrix in MATLAB.

Thank you

Stuart McGarrity replied on : 39 of 57

Hi ezgi, Are m1 and m2 variables? I’d try creating one long row the reshape it. You could start with zeros then index in to assign the variables.

Raisul replied on : 40 of 57

Impulse =961 by 1 double residual =5142 by 32 double

impulse=impulse(:);
residual=v;
[m,n]=size(v);
HD=[];
%
for i=1:m
for j=1:n
HD = impulse(:).*v(i);
end
end
GHD=zscore(HD);

The problem is with the for loop I get the output for the first column only. So I get HD= p by 1 matrix. I want HD =p by 32 matrix. Currently, my impulses elements are multiplied with elements with the rows for the first column only. What modification should I do here to have all elements of impulse to be multiplied with all other columns just as it does for the first column in this loop. So I just need the same operation executed across all columns of v. What might be the nested loop? Should I use another for loop or a while loop inside..I appreciate your skilled solutions. As you see I am a new user, you are helping a lot.

Sareh replied on : 41 of 57

Hi
0《u《1
And other matrix b=[1 0 0 0;0 0 1 0;-3 3 -2 -1;2 -2 1 1]

Dami replied on : 42 of 57

Hey,
Please how do I use a four loop statement to perform arithmetic operations such as addition, subtraction and multiplication on a 2 multi-dimensional array.
A = [2, 3, 4, 5; 6, 7, 8, 2; 1, 5, 6, 7] & B = [4, 5, 6, 7; 8, 4, 5, 6; 2, 3, 4, 8]

Braiki Marwa replied on : 43 of 57

HI, i trained two-class-classification (svmtrain) with 15 features for 18 images and i have many objects in a single image. I want to save single .mat file of features of these images?my problem is when i run this code i have just the variables of last image!!

for n=n1:n2 (number of images)

for k=1:length(B3) (number of objects in a signle image)

Feat(k,:)=[Area_cellule,Perimeter_cellule,Circularity_cellule,Compactness_cellule, Solidity_cellule,Eccentricity_cellule,MajorAxis_cellule,MinorAxis_cellule, Centroid_cellule,Ampl,Contrast_Cellule,Correlation_Cellule,Energy_Cellule,Homogeneity_Cellule];

end
end
save(‘FeatTrain.mat’, ‘Feat’);

stuartmcgarrity replied on : 44 of 57

Hi Braiki, Your Feat variable gets overwritten each n loop. You would need to add another dimension to the matrix to store each image i.e.

Feat(k,:n)=[Area_…. This should work if Feat has the same dimensions for each image. If not, you would need to use a cell array. i.e.

Feat{n}(k:n)=[Area_

Oyebee replied on : 45 of 57

Please how do i create a 100 by 100 matrix that looks like this

[ 1 2 3 4 ….100
2 3 4 5…101
3 4 5 6 …. 102}

and so on

javed replied on : 46 of 57

please tell me how to restructure of broken picture. Please tell me if i can’t restructured the photo r picture i have lost my four years study. please help me

stuartmcgarrity replied on : 47 of 57

Hi Oyebee, What have you tried so far?

stuartmcgarrity replied on : 48 of 57

Hi Javed, I’m not sure what you mean.Is it related to this post?

say replied on : 49 of 57

how can i construct a matrix for Cij =1/(xi – yj) ?

Omololu Makinde replied on : 50 of 57

Could you please show me how to create a 1xmxn multidimensional array with a 3×3 matrix using a for loop?

Stuart McGarrity replied on : 51 of 57

Hi Say, This should work:

x=1:10;y=1:10; % Two row vectors
C=1./(x-y’); % Transpose y into a column

Stuart McGarrity replied on : 52 of 57

Hi Omololu, What have you tried so far?

Monalisha replied on : 53 of 57

Can I convert a 1:7 matrix to a 1:4 matrix.?

Monalisha replied on : 54 of 57

How to convert a 1:7 matrix to 1:4 matrix

Stuart McGarrity replied on : 55 of 57

Hi Monalisha, Could you give a bit more information? What are the actual dimensions of the matrix before and after? I assume its not 1×7 and 1×4.

Bhupesh Chandra Gupta replied on : 56 of 57

How to solve this question??
“Use loops and conditional statements to create a 5 by 8 matrix in the value of each element is equal to the square root of the sum of the element’s indices unless the element is in an even numbered column or row.The value of an element in an even numbered column or row is equal to the sum of the element’s indices squared.(The indices of an element in a matrix are the row number and column number of the elements.) “

Stuart McGarrity replied on : 57 of 57