2012-07-31 89 views
-2

我有兩個矩陣:矩陣{a} < 252x1>是矩陣{b} < 252x4000>的一個子集。我需要確定矩陣{a}出現在矩陣{b}之前和之後的天數。複雜的Matlab

Example: 

Matrix a Matrix b 
10  12 34 54 10 
23  23 98 78 98 
43  98 53 43 88 
44  98 44 88 78 

Output 
1 1 1 10 
23 1 1 1 
1 1 43 1 
1 44 1 1 

Days 
3 0 
0 3 
2 1 
1 2 

回答

1

這個答案假定只有一個每行的比賽:

a = [10;23;43;44] 
b = [12 34 45 10;23 98 78 98;98 53 43 88; 98 44 88 78] 
l = bsxfun(@eq, a, b) 
[c r] = find(l') 
Days = [c - 1, size(b, 2) - c] 
Output = b.*l + ~l 

如果假設是壞的話,我想你會使用循環會更好。

+0

如果假設不好,你將如何實現for循環? – Buntalan 2012-07-31 14:12:40

+0

從這裏開始:l = bsxfun(@eq,a,b)並試一試。如果您遇到問題,請發佈您的代碼。 – Dan 2012-07-31 14:16:27

1

假設恰好有一個在b每行的a occurence:

使用bsxfun獲得result:使用find有兩個

result=ones(size(b)); 
ainb=bsxfun(@eq,a,b); 
result(ainb)=b(ainb); 

找到列索引,其中,ab輸出參數,並從中推斷出天數:

[colidx_rev,~] = find(ainb); 
colidx(colidx_rev,1) = 1:4; 

Days = [colidx-1 size(b,2)-colidx]; 

當您看到any(sum(ainb,2)>1)時,每行有多個匹配項。接下來要做的是選擇一個(例如第一個匹配)。通過尋找另一種方式列索引,使用循環或使用較短做arrayfun此:

col_idx = arrayfun(@(rowi) find(ainb(rowi,:),1),1:size(b,1))'; 

其餘的是類似的。