使用' find'在矩阵的行上没有循环

时间:2015-10-14 21:32:09

标签: matlab matrix vectorization

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

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

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

1 个答案:

答案 0 :(得分: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