【问题标题】:Lowest starting row indices for minimum 2 consecutive non-zero values per column每列最少 2 个连续非零值的最低起始行索引
【发布时间】:2015-08-14 16:55:36
【问题描述】:

考虑样本矩阵:

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 表示minimum 2 consecutive non-zero values 的条件不成立。

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

【问题讨论】:

  • 位置如何在 MATLAB 中为零,它基于 1 的索引。另外,如果你能解释一下输出是怎么来的,那就更好了。
  • 我没有说位置为零。我只是说,如果我的条件不成立,请将其设置为零。

标签: matlab matrix


【解决方案1】:

最少 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

示例运行 -

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 convolution 作为 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

请注意,2D 卷积可以替换为 Luis 在 cmets 中提到的可分离卷积版本,这似乎要快一些。更多信息请访问link。所以,

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

示例运行 -

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

【讨论】:

  • 再次感谢您,它有效。我将不得不使用最小连续值阈值。
  • 这正是我想要的,能够使 N 动态化。我感谢您的帮助。干杯。
  • conv2 进行泛化很棒:) 已经添加了我的投票:P
  • 您可以使用conv2separable 版本节省一些时间:conv2(ones(N,1),1,double(mask),'valid')。即使内核是单列,在我的机器上显式调用可分离版本似乎更快
  • @LuisMendo 非常感谢,这些信息非常有用!在我的末端似乎也更快。添加到解决方案中。
猜你喜欢
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多