2016-09-20 64 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