我有一个逻辑数组B
和一个大小为A
x n
的矩阵2
,其中包含n
对开始/停止索引
A= [start1, stop1; start2, stop2; start3, stop3];
如何根据数组B
中包含的开始/停止对选择数组A
的子数组?
我是这样做的:
for i=1:1:size(A,1)
B(A(i,1):A(i,2)) = true;
end
有没有办法以更优雅的方式使用for循环(甚至方便地重新排列数组A
)?
答案 0 :(得分:4)
你可以
n = numel(B);
iA = zeros( 1, n+1 ); %// +1 for boundary case
iA( A(:,1) ) = 1;
iA( A(:,2)+1 ) = -1;
iA(end) = []; %// discard boundary entry
B( cumsum(iA) > 0 ) = true;
做出的假设
A(:,1)
始终为> = 1 A(:,2)
始终为< = n
(B
中的元素数量)A
中定义的部分不重叠答案 1 :(得分:2)
如果确保每个止损小于下一次开始(指数范围不重叠),则另一种方法是
B(mod(sum(bsxfun(@le, 1:numel(B), [A(:,1)-1; A(:,2)])),2)>0) = true;