use two indexes at the same time in a for loop

조회 수: 21 (최근 30일)
Alberto Acri
Alberto Acri 2023년 2월 21일
댓글: dpb 2023년 2월 21일
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

채택된 답변

dpb
dpb 2023년 2월 21일
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
dpb
dpb 2023년 2월 21일
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.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Jan
Jan 2023년 2월 21일
편집: Jan 2023년 2월 21일
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).

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

제품


릴리스

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by