2016-09-20 59 views
3

假設我有以下矩陣:找到獨特的對在矩陣

A = [1 1 2 1;1 2 2 1;2 1 3 0;2 2 2 0;3 1 2 1] 

其中第一列是索引,並且接下來的兩個交互,最後一個邏輯說yes或no。 所以知道我想根據交互生成以下熱圖。 「X」軸表示相互作用,「Y」軸表示索引。

1-2 1-3 2-2 
1 1 NaN 1 
2 NaN 0 0 
3 1 NaN NaN 

我目前的做法:

B = sortrows(A,[2,3]); 

後來我申請找出每行和每列分別。

是否有與unique類似的功能,可以同時檢查兩列?

回答

7

這裏有一個方法,使用unique(...,'rows')

A = [1 1 2 1; 1 2 2 1; 2 1 3 0; 2 2 2 0; 3 1 2 1]; % data 
[~, ~, jj] = unique(A(:,[2 3]),'rows'); % get interaction identifiers 
B = accumarray([A(:,1) jj], A(:,4), [], @sum, NaN); % build result, with NaN as fill value 

這給

B = 
    1 NaN  1 
    NaN  0  0 
    1 NaN NaN 
2
>> A 

A = 

    1  1  2  1 
    1  2  2  1 
    2  1  3  0 
    2  2  2  0 
    3  1  2  1 

>> [C, IA, IC] = unique(A(:, [2, 3]), 'rows') 

C = 

    1  2 
    1  3 
    2  2 

IA = 

    1 
    3 
    2 

IC = 

    1 
    3 
    2 
    3 
    1 

C是一組獨特的對。 IAC(即,C == A(IA, [2, 3]))的對應索引。 IC是每行的對應索引(即,A(:, [2, 3]) == C(IC, :))。

1

這是@Jeon的答案的幫助(更新)一個可能的解決方案:

A = [1 1 2 1;1 2 2 1;2 1 3 0;2 2 2 0;3 1 2 1] 
[~,IA,idx] = unique(A(:, [2, 3]), 'rows'); 
r = max(A(:,1)); 
c = numel(IA); 
out= NaN(r,c); 
out(sub2ind([r ,c], A(:,1),idx)) = A(:,4) 
+2

Psst:'出NaN(r,c)'有點更優雅:) –

+1

謝謝。但結果並不完全正確。 –

+0

@StewieGriffin謝謝。更改爲NaN() – rahnema1