我有这个矩阵:
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
的列索引,因为您只使用了 find 的第二个输出
。
[~, col] = find(a == 1)
% 1 1 2 4
当您将其用作 a
的索引时,它将把它们视为线性索引,并且仅将 a
中的第一个、第二个和第四个值更改为 0
。在 column-major order 中执行线性索引所以这会导致您看到的输出。
要完成您想要做的事情,您需要find
的两个 输出来获取行和列索引,然后使用sub2ind
将这些转换为线性索引,然后您可以将其用于索引到 a
。
[row, col] = find(a == 1);
a(sub2ind(size(a), row, col)) = 0;
使用 find
的单一输出版本要容易得多,它直接返回线性索引并使用它。
ind = find(a == 1);
a(ind) = 0;
或者更好的是,只使用逻辑索引
a(a == 1) = 0;
关于matlab - find() 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40844980/