【问题标题】:Strange behavior of find()find() 的奇怪行为
【发布时间】:2016-11-28 21:58:23
【问题描述】:

我有这个矩阵:

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() 的奇怪行为。当我看到当前标题(find() 不起作用)时,我的第一个想法是“当然可以”

标签: matlab matrix


【解决方案1】:

按照您的操作方式,您只会获得1列索引,因为您只使用find 的第二个输出。

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

当您将其用作a 的索引时,它会将它们视为线性索引,并且仅将a 中的第一个、第二个和第四个值更改为0。线性索引是在column-major order 中执行的,所以这会产生您所看到的输出。

要做你想做的事,你需要findboth 输出来获取行和列索引,然后使用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;

【讨论】:

  • 非常感谢!我现在明白我的错误了! :)
猜你喜欢
  • 2013-09-27
  • 1970-01-01
  • 2015-01-11
  • 2020-03-09
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
  • 2012-10-13
  • 2016-12-09
相关资源
最近更新 更多