2016-11-28 196 views
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?

+4

的问题是有趣的,并得到了很好的答案。但我建议将标题更改为find()_的_Strange行为。当我看到当前标题(_find()不工作)时,我的第一个想法是“当然它是的” –

回答

7

,你正在做它的方式,因为你只使用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; 
+0

非常感谢!我现在明白我的错误! :) – henry