如果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
我确信有更好的方法不涉及循环。有什么建议吗?
答案 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
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