need help making a 'for' loop to make a new matrix

2 Ansichten (letzte 30 Tage)
Kamyar Mazarei
Kamyar Mazarei am 20 Jul. 2021
Kommentiert: Rik am 20 Jul. 2021
hi
i have 40 matrixes 13x16
i want to make a new matrix 1x40 with max values
im using this:
for iii=1:40
M(1,iii)=max(max(['m-' num2str(iii,'%01d')]));
end
but M values are all 109 (max value of each matrix are less than 1)
im nwe to matlab and i found it on internet and dont know if its right or not
  1 Kommentar
Rik
Rik am 20 Jul. 2021
You may consider doing the Onramp tutorial (which is provided for free by Mathworks) to get familiar with the Matlab basics.

Melden Sie sich an, um zu kommentieren.

Antworten (2)

Jonas
Jonas am 20 Jul. 2021
Bearbeitet: Jonas am 20 Jul. 2021
your loop calculates the maximum value of a character array. since the character 'm' has value 109 (see double('m')) and your character numbers are 48 (double('0')) and 57 (double('9')) all max values are 109.
what do you want to do actually, are there variables in your workspace called m1 to m40? if you created your variables earlier it would be better to save all of them in the same variable, e.g. in the size of 13x16x40
short example how to get the max of each matrix then
a=rand([3 3 3])
max(a,[],[1 2])
  2 Kommentare
Kamyar Mazarei
Kamyar Mazarei am 20 Jul. 2021
how do i make 13x16x40?
also isnt there a way to creat the matrix using a loop for m1 to m40?
thank you for replying
Jonas
Jonas am 20 Jul. 2021
to be honest there is a direct possibility. but it uses a method that should be avoided. you can use the eval function for that:
M(1,iii)=max(eval(['m-' num2str(iii,'%01d')]),[],'all');
using eval is bad style and should be avoided. it makes the code unreadable and is most of the case a result of bad data organisation. if you have data that belong to each other, try to save them together and don't use the same variable name with different numbers at the end.

Melden Sie sich an, um zu kommentieren.


Rik
Rik am 20 Jul. 2021
Having numbered variables is a problem that should be solved when you create those variables. If you have 40 variables with the same name, that probably means it is actually an array, instead of independent variables. Why not make it an array then? With an array you can use a simple for loop to process each element.
m1=rand(13,16);m2=rand(13,16);m3=rand(13,16);m4=rand(13,16);m5=rand(13,16);m6=rand(13,16);m7=rand(13,16);m8=rand(13,16);m9=rand(13,16);m10=rand(13,16);m11=rand(13,16);m12=rand(13,16);m13=rand(13,16);m14=rand(13,16);m15=rand(13,16);m16=rand(13,16);m17=rand(13,16);m18=rand(13,16);m19=rand(13,16);m20=rand(13,16);m21=rand(13,16);m22=rand(13,16);m23=rand(13,16);m24=rand(13,16);m25=rand(13,16);m26=rand(13,16);m27=rand(13,16);m28=rand(13,16);m29=rand(13,16);m30=rand(13,16);m31=rand(13,16);m32=rand(13,16);m33=rand(13,16);m34=rand(13,16);m35=rand(13,16);m36=rand(13,16);m37=rand(13,16);m38=rand(13,16);m39=rand(13,16);m40=rand(13,16);
%Let's fix the mess first. You should fix it when the variables are
%created.
for n=1:40
m_array{n}=eval(sprintf('m%d',n));
end
%since they are all the same size, we don't actually need a cell aray
m_array=cat(3,m_array{:});
size(m_array)
ans = 1×3
13 16 40
%now we use max. since a few releases back we can use this syntax:
max_vals=max(m_array,[],[1 2]);
%this is 1x1x40, so let's reshape
max_vals=reshape(max_vals,1,[])
max_vals = 1×40
0.9824 0.9919 0.9995 0.9946 0.9944 0.9945 0.9773 0.9993 0.9915 0.9999 0.9938 0.9988 0.9975 0.9989 0.9990 0.9976 0.9999 0.9975 0.9996 0.9985 0.9912 0.9979 0.9894 0.9973 0.9994 0.9873 0.9984 0.9984 0.9935 0.9994

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by