在矩阵中查找唯一的对数

3

假设我有以下矩阵:

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

第一列是索引,接下来两列是互动,最后一列是逻辑,表示是否。现在,我想根据这些互动生成以下热图。 "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的函数可以同时检查两列?

3个回答

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
嘘,out NaN(r,c) 更加优雅一些 :) - Stewie Griffin
@StewieGriffin 谢谢。改为NaN()。 - rahnema1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接