在Matlab中使用带索引向量的循环设置表值

时间:2015-04-23 20:38:46

标签: matlab

我有一系列坐标(i,j),我想遍历每一个坐标。

例如

A = ones(3,3);
i = [1 2 3];
j = [3 2 1];

我试过这个,但它不起作用:

for (i = i && j = j)
   A(i,j) = 0;
end

我也试过这个但是它按预期工作了:

for i = i
    for j = j
        A(i,j) = 0;
    end
end

期望的结果:

A =
1 1 0
1 0 1
0 1 1

虽然此示例中A是一个矩阵,但我正在处理表数据。

2 个答案:

答案 0 :(得分:3)

执行所需操作的正确语法是:

A = ones(3,3);
i = [1 2 3];
j = [3 2 1];

for ii = 1:length( i )
    A( i(ii) , j(ii) ) = 0;
end

基本上,您使用i循环遍历每个元素并相应地索引jiiii遍历1..3索引每个元素。

这将给出下面的最终结果。

>> A
A =
     1     1     0
     1     0     1
     0     1     1

虽然这有效并且可以解决您的问题,但如果您没有涉及更复杂的操作,我建议rayryeng's alternate solution进行转换。

答案 1 :(得分:2)

虽然这并没有回答你关于for循环的问题,但我会避免一起使用循环并创建列主线性索引来访问你的矩阵。使用sub2ind来帮助实现这一目标。 sub2ind会获取相关矩阵的大小,行位置和列位置。输出将是一个值数组,用于指定要在矩阵中访问的列主要位置。

因此:

A = ones(3); i = [1 2 3]; j = [3 2 1]; %// Your code
%// New code
ind = sub2ind(size(A), i, j);
A(ind) = 0;

鉴于您有一个表,您可以将表转换为数组,在此数组上应用sub2ind,然后在完成后将结果转换回表。 table2arrayarray2table是有用的工具。鉴于您的表格存储在A中,您可以尝试:

Atemp = table2array(A);
ind = sub2ind(size(Atemp), i, j);
Atemp(ind) = 0;
A = array2table(Atemp);