【问题标题】:Using 'find' on rows of a matrix without looping在矩阵的行上使用“查找”而不循环
【发布时间】:2015-10-14 21:32:08
【问题描述】:

如果 A 是一个由 0 和 1 组成的 nx × ny 矩阵,我想找到每行中第一个和最后一个零的索引。目前我正在做以下事情:

for ix = 1:nx
    lhs_i = find(A(ix,:) < 1,1,'first');
    rhs_i = find(A(ix,:) < 1,1,'last');
    if ~isempty(lhs_i)
        lhs(ix,k) = lhs_i;
        rhs(ix,k) = rhs_i;
    else
        lhs(ix,k) = NaN;
        rhs(ix,k) = NaN;
    end
end

我确信有一种更好的方法,它不涉及循环。有什么建议吗?

【问题讨论】:

    标签: matlab matrix vectorization


    【解决方案1】:

    你可以使用accumarray -

    [R,C] = find(A==0);
    out = zeros(size(A,1),2)
    out(1:max(R),:) = [accumarray(R,C,[],@min) accumarray(R,C,[],@max)]
    

    最后,如果需要,将 zeros 替换为 NaNs,但零本身看起来像是无效行(没有零的行)的良好说明符。

    示例运行 -

    >> A
    A =
         3     1     3     3     4
         0     3     0     2     0
         0     0     4     4     0
         1     4     1     4     2
    >> [R,C] = find(A==0);
    >> out = zeros(size(A,1),2);
    >> out(1:max(R),:) = [accumarray(R,C,[],@min) accumarray(R,C,[],@max)]
    out =
         0     0
         1     5
         1     5
         0     0
    

    这是另一个使用bsxfunminmax -

    P = bsxfun(@times,A==0,1:size(A,2));
    P(P==0) = nan;
    out = minmax(P)
    

    使用此解决方案,Inf/-Inf 将充当无效说明符。

    示例运行 -

    >> A
    A =
         0     4     0     2     2
         3     4     3     1     1
         0     4     3     1     2
         1     0     3     4     0
    >> P = bsxfun(@times,A==0,1:size(A,2));
    >> P(P==0) = nan;
    >> minmax(P)
    ans =
         1     3
      -Inf   Inf
         1     1
         2     5
    

    【讨论】:

      猜你喜欢
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 2012-09-02
      • 2021-01-29
      • 2017-08-11
      • 1970-01-01
      相关资源
      最近更新 更多