考虑样本矩阵:
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/