8
我有这样的矩阵:奇怪的行为()
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?
我有这样的矩阵:奇怪的行为()
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?
,你正在做它的方式,因为你只使用find
第二输出,你只得到列索引1
的的。
[~, 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;
非常感谢!我现在明白我的错误! :) – henry
的问题是有趣的,并得到了很好的答案。但我建议将标题更改为find()_的_Strange行为。当我看到当前标题(_find()不工作)时,我的第一个想法是“当然它是的” –