1

行列 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  

S は次のとおりです。

 0     2     0     0
 0     0     0     0
 0     0     0     1
 0     0     0     0

(対角線は気にしません。対角線がある場合とない場合があります。また、S が対称である可能性もあります)。

S(1,2) = 2 

11 と 23 (位置 1,2 にある) が 2 回一緒に現れたからです (つまり、X(:,1) の値が同じ)。

ありがとう

4

2 に答える 2

4

これはそれを行う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
于 2013-09-10T06:52:10.787 に答える
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);

この場合の結果 (明らかに対称行列):

>> C
C =
     0     2     0     0
     2     0     0     0
     0     0     0     1
     0     0     1     0

または行/列ヘッダーできれいに印刷されます:

>> [{[]} 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]
于 2013-09-10T07:21:00.910 に答える