matlab - find() 的奇怪行为

标签 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列索引,因为您只使用了 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/

相关文章:

r - 如何根据另一行重新排列矩阵,data.frame或vector的行

r - 将函数列表应用于矩阵并返回矩阵作为 R 中的结果

algorithm - 如果要加密的字母数发生变化,Hill Cipher key 是否会有所不同?

matlab - 下标索引必须是正实整数或 svmclassify matlab 中的逻辑数

r - 使用 kde2d (R) 和 ksdensity2d (Matlab) 生成的 2D KDE 的差异

matlab - 在 Matlab 中读取和查看大 tiff

python - (在 OpenCV 中将 .mat 文件作为图像加载)- 将具有 128 个 channel 的 numpy 数组 reshape 为 3 个 channel

iOS - 使用 Accelerate.framework 计算矩阵每一行和/或列的点积

opencv - 将CvSeq转换为CvMat

java matlab 如何在 matlab 脚本中运行 jar?