matlab - 每列最少 2 个连续非零值的最低起始行索引

标签 matlab matrix

考虑样本矩阵:

A =
     0     0     0     0    -4     3
     0     2     1     0     0     0
     0     5     0     8     7     0
     0     9    10     3     1     2

我想为 A 的每一列找到最低的起始位置(行索引),其中找到至少 2 个连续的非零值。输出看起来像这样:

Output = [0, 2, 0, 3, 3, 0]

输出中的 0 表示最少 2 个连续非零值 的条件不成立。

另外,这是否可以推广到寻找最小 N 个连续非零值的起始索引的情况?

最佳答案

至少有 2 个连续的非零值情况

%// Mask of non-zeros in input, A
mask = A~=0

%// Find starting row indices alongwith boolean valid flags for minimum two 
%// consecutive nonzeros in each column
[valid,idx] = max(mask(1:end-1,:) & mask(2:end,:),[],1)

%// Use the valid flags to set invalid row indices to zeros
out = idx.*valid

sample 运行-

A =
     0     0     0     0    -4     3
     0     2     1     0     0     0
     0     5     0     8     7     0
     0     9    10     3     1     2
mask =
     0     0     0     0     1     1
     0     1     1     0     0     0
     0     1     0     1     1     0
     0     1     1     1     1     1
valid =
     0     1     0     1     1     0
idx =
     1     2     1     3     3     1
out =
     0     2     0     3     3     0

一般情况

对于最小 N 个连续非零情况的一般情况,您可以将 2D 卷积 与内核一起用作 N 的列向量,就像这样 -

mask = A~=0  %// Mask of non-zeros in input, A

%// Find starting row indices alongwith boolean valid flags for minimum N 
%// consecutive nonzeros in each column
[valid,idx] = max(conv2(double(mask),ones(N,1),'valid')==N,[],1)

%// Use the valid flags to set invalid row indices to zeros
out = idx.*valid

请注意,正如 Luis 在评论中提到的那样,二维卷积可以替换为可分离的卷积版本,这似乎更快一些。有关这方面的更多信息,请访问此 link .所以,

conv2(double(mask),ones(N,1),'valid') 可以替换为 conv2(ones(N,1),1,double(mask) ,'有效').

sample 运行-

A =
     0     0     0     0     0     3
     0     2     1     0     1     2
     0     5     0     8     7     9
     0     9     0     3     1     2
mask =
     0     0     0     0     0     1
     0     1     1     0     1     1
     0     1     0     1     1     1
     0     1     0     1     1     1
N =
     3
valid =
     0     1     0     0     1     1
idx =
     1     2     1     1     2     1
out =
     0     2     0     0     2     1

关于matlab - 每列最少 2 个连续非零值的最低起始行索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30569986/

相关文章:

validation - 检查 MATLAB 中的日期一致性

r - 为什么 diag 功能这么慢? [在 R 3.2.0 或更早版本中]

c++ - 运算符重载的矩阵乘法

java - 使用坐标存储系统创建稀疏矩阵?

matlab - 多维数据存储和插值

matlab - 如何使用 Matlab 通过最近邻插值法旋转图像

arrays - 查找每个值最后一次出现的索引

matlab - 运行一个函数并在 matlab 中使用不同的输入保存多个输出

c++ - OpenCV 函数来计算类似于 MATLAB 产品的数组元素的乘积?

c++ - 在 C++ 中使用 Eigen/Sparse 库,有没有办法从稀疏矩阵中删除列?