use two indexes at the same time in a for loop

19 vues (au cours des 30 derniers jours)
Alberto Acri
Alberto Acri le 21 Fév 2023
Commenté : dpb le 21 Fév 2023
Hi! I have the following matrix:
M = [26 45 15 47 78 9 6 45 14 66 95 6;
65 35 96 39 7 88 47 11 14 75 77 86;
41 25 37 84 92 66 96 67 44 21 33 49;
52 65 95 85 74 37 12 45 55 17 99 47;
82 99 32 41 55 47 33 28 47 87 96 25];
I need to replace some numbers in the bottom left-hand corner with the numbers in the following matrix:
matrix_left = [0 0; 0 0];
The output matrix must be this:
M = [26 45 15 47 78 9 6 45 14 66 95 6;
65 35 96 39 7 88 47 11 14 75 77 86;
41 25 37 84 92 66 96 67 44 21 33 49;
0 0 95 85 74 37 12 45 55 17 99 47;
0 0 32 41 55 47 33 28 47 87 96 25];
I tried the following code, but I can't understand how to use the "i" and "k" values at the same time.
M = [26 45 15 47 78 9 6 45 14 66 95 6;
65 35 96 39 7 88 47 11 14 75 77 86;
41 25 37 84 92 66 96 67 44 21 33 49;
52 65 95 85 74 37 12 45 55 17 99 47;
82 99 32 41 55 47 33 28 47 87 96 25];
matrix_left = [0 0; 0 0];
for i = 4:5 & k = 1:2
for j = 1:2
M(i,j) = matrix_left(k,j);
end
end

Réponse acceptée

dpb
dpb le 21 Fév 2023
for i = 4:5
for j = 1:2
M(i,j) = 0;
end
end
If it weren't a contstant on the RHS and the array was only the size of the target, then you would have to have another counter or use an offset on the RHS indexing to be in bounds for it --
k=0;
for i = 4:5
k=k+1;
for j = 1:2
M(i,j) = matrix_left(k,j);
end
end
However, "the MATLAB way" to do such things as this is to use indexing expressions -- no loops are needed --
M(4:5,1:2)=0;
Better coding practice would be to define the indices as variables instead of burying "magic numbers" in code; then when/if the target location changes or something as simple as the array size changes, only change data, not the code itself.
  1 commentaire
dpb
dpb le 21 Fév 2023
ADDENDUM:
I forgot to add the second example that @Jan showed when the RHS is not a constant of using the full array syntax; that's also a very important MATLAB idiom
M(4:5,1:2)=RHS; % where the RHS is a conformal-sized array
Of course, RHS can be a vector and MATLAB will assigned the elements to the array locations in column-major storage order.

Connectez-vous pour commenter.

Plus de réponses (1)

Jan
Jan le 21 Fév 2023
Modifié(e) : Jan le 21 Fév 2023
for i = 4:5 & k = 1:2
This is pure guessing. While some human can understand, what you want, if you apply such trivks inspoken language, formal systems like programming languages do not tolerate it.
A simple solution is to omit the loop:
M(4:5, 1:2) = matrix_left;
If you really want a loop or this was a simplified example only, you can use "2nd-level indexing":
index_M1 = 4:5;
index_M2 = 1:2;
index_L1 = 1:2;
index_L2 = 1:2;
for i1 = 1:numel(index_M1)
for i2 = 1:numel(index_M2)
M(index_M1(i1), index_M2(i2)) = L(index_L1(i1), index_L2(i2));
end
end
This is a usual method, if the argument is not an integer:
t = 0:0.01:pi;
x = zeros(size(t));
for k = 1:numel(t)
x(k) = sin(t(k));
end
x(t) would not work, but this kind of indexing combines x(k) with t(k).

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Produits


Version

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by