matrix matlab中对的计数频率
我有矩阵X,mX2,我想得到一个大小为S的矩阵matrix matlab中对的计数频率,matlab,sparse-matrix,Matlab,Sparse Matrix,我有矩阵X,mX2,我想得到一个大小为S的矩阵 size(unique(X(:,2),1) X size(unique(X(:,2),1) 对于每个S(i,j),我想计算i,j一起出现的次数。 例如: X = [1 11 ; 2 11; 3 11; 5 23; 6 23; 1 23; 9 24; 9 25; 3 23; 10 23] unique(X(:,2)) 11 23 24 25
size(unique(X(:,2),1) X size(unique(X(:,2),1)
对于每个S(i,j),我想计算i,j一起出现的次数。
例如:
X = [1 11 ;
2 11;
3 11;
5 23;
6 23;
1 23;
9 24;
9 25;
3 23;
10 23]
unique(X(:,2))
11
23
24
25
S应为:
0 2 0 0
0 0 0 0
0 0 0 1
0 0 0 0
(我不关心对角线,它可能有也可能没有,而且S可能是对称的)
因为11和23(位于位置1,2)同时出现了两次(即在X(:,1)中具有相同的值)
谢谢这是一种方法:
[~, ~, n1] = unique(X(:,1));
[~, ~, n2] = unique(X(:,2));
B = accumarray([n2 n1],1);
S = B*B';
这给出了完整的矩阵:
>> S
S =
3 2 0 0
2 5 0 0
0 0 1 1
0 0 1 1
要删除对角线和下三角形,可以使用
S = triu(B*B',1);
产生
>> S
S =
0 2 0 0
0 0 0 0
0 0 0 1
0 0 0 0
这是一种方法:
[~, ~, n1] = unique(X(:,1));
[~, ~, n2] = unique(X(:,2));
B = accumarray([n2 n1],1);
S = B*B';
这给出了完整的矩阵:
>> S
S =
3 2 0 0
2 5 0 0
0 0 1 1
0 0 1 1
要删除对角线和下三角形,可以使用
S = triu(B*B',1);
产生
>> S
S =
0 2 0 0
0 0 0 0
0 0 0 1
0 0 0 0
请尝试以下操作:
% convert each columns to indices starting from 1
[a,~,aa] = unique(X(:,1));
[b,~,bb] = unique(X(:,2));
% group occurences of col2 according to values of col1
C = accumarray(aa, bb, [], @(x){x});
% keep only occurences of two or more values
C = C(cellfun(@numel,C) > 1);
% in case of three or more values co-occured, generate all pairs
C = cellfun(@(v) nchoosek(v,2), C, 'UniformOutput',false);
% concatenate all pairs
C = cell2mat(C);
% build count matrix
C = sparse(C(:,[1 2]), C(:,[2 1]), 1);
C = full(C);
这种情况下的结果(显然是对称矩阵):
或使用行/列标题打印:
>> [{[]} num2cell(b'); num2cell(b) num2cell(C)]
ans =
[] [11] [23] [24] [25]
[11] [ 0] [ 2] [ 0] [ 0]
[23] [ 2] [ 0] [ 0] [ 0]
[24] [ 0] [ 0] [ 0] [ 1]
[25] [ 0] [ 0] [ 1] [ 0]
请尝试以下操作:
% convert each columns to indices starting from 1
[a,~,aa] = unique(X(:,1));
[b,~,bb] = unique(X(:,2));
% group occurences of col2 according to values of col1
C = accumarray(aa, bb, [], @(x){x});
% keep only occurences of two or more values
C = C(cellfun(@numel,C) > 1);
% in case of three or more values co-occured, generate all pairs
C = cellfun(@(v) nchoosek(v,2), C, 'UniformOutput',false);
% concatenate all pairs
C = cell2mat(C);
% build count matrix
C = sparse(C(:,[1 2]), C(:,[2 1]), 1);
C = full(C);
这种情况下的结果(显然是对称矩阵):
或使用行/列标题打印:
>> [{[]} num2cell(b'); num2cell(b) num2cell(C)]
ans =
[] [11] [23] [24] [25]
[11] [ 0] [ 2] [ 0] [ 0]
[23] [ 2] [ 0] [ 0] [ 0]
[24] [ 0] [ 0] [ 0] [ 1]
[25] [ 0] [ 0] [ 1] [ 0]
+1个不错的矩阵乘法技巧,不是很明显它是如何工作的:)+1个不错的矩阵乘法技巧,不是很明显它是如何工作的:)非常好,但之后有点过度。非常好,但之后有点过度。