find()的奇怪行为

时间:2016-11-28 13:00:49

标签: matlab matrix

我有这个矩阵:

a = [1 2 2 1; 1 1 2 2]

%   1     2     2     1 
%   1     1     2     2

我想找到所有1并将它们归零。

[~, a_i] = find(a == 1);
a(a_i) = 0

%   0     2     2     1 
%   0     0     2     2

为什么第一排还有1?

1 个答案:

答案 0 :(得分:7)

您正在使用1的第二个输出,因此您只能获得find列索引。 }。

[~, col] = find(a == 1)
%   1   1   2   4

当您将其用作a的索引时,它会将这些视为线性索引并仅将a中的第1,第2和第4个值更改为{{1} }}。线性索引在column-major order中执行,因此这会导致您看到的输出。

要执行您尝试执行的操作,您需要两个输出0以获取行和列索引,然后使用find转换这些到一个线性索引,然后你可以用它来索引sub2ind

a

使用[row, col] = find(a == 1); a(sub2ind(size(a), row, col)) = 0; 的单输出版本更容易,它直接返回线性索引并使用它。

find

或者更好的是,只需使用逻辑索引

ind = find(a == 1);
a(ind) = 0;