2015-01-14 90 views
0

我有一個邏輯陣列B和尺寸含有n聯接開始的n X 2的矩陣A /停止索引Matlab的:從索引選擇子陣列矩陣

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 

是否有更優雅的方式做這件事,而無需使用任何方式進行循環(甚至方便清理陣列A)?

回答

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; 

假設而

  1. A(:,1)總是> = 1
  2. A(:,2)總是< = n(在B數目的元件)
  3. 中所定義的部分A不重疊
+0

如果B'的'大小在'A'來定義的更小的你可以設置'n'爲'n = max(A(:,2));' – Shai

+1

不是。感謝您的建議,但是我應該定義一個我想避免的矩陣。 – RockeJoe

2

如果每個止動是有保證爲比下一個開始(指數範圍不重疊),另一種方法是

B(mod(sum(bsxfun(@le, 1:numel(B), [A(:,1)-1; A(:,2)])),2)>0) = true; 
+1

[標籤:bsxfun]岩石!!! – Shai

+0

@Shai :-)但是在這種情況下,它可能是非常低效的內存 –

+2

岩石!不要與'bsxfun'爭吵! – Shai