计算矩阵列中数字的共同发生率 - MATLAB

Ann*_*ann 5 matlab

我有一个矩阵(A)的形式(实际上更大):

205   204   201
202   208   202
Run Code Online (Sandbox Code Playgroud)

如何在逐列的基础上统计数字的共同发生率,然后将其输出到矩阵?

我希望最终矩阵从min(A):max(A)(或能够指定特定范围)跨顶部和侧面运行,并且它可以计算每列中数字的共同发生率.使用上面的例子:

    200 201 202 203 204 205 206 207 208
200  0   0   0   0   0   0   0   0   0
201  0   0   1   0   0   0   0   0   0
202  0   0   0   0   0   1   0   0   0 
203  0   0   0   0   0   0   0   0   0
204  0   0   0   0   0   0   0   0   1
205  0   0   0   0   0   0   0   0   0
206  0   0   0   0   0   0   0   0   0
207  0   0   0   0   0   0   0   0   0
208  0   0   0   0   0   0   0   0   0
Run Code Online (Sandbox Code Playgroud)

(不需要矩阵标签)

两个要点:计数需要不重复并按数字顺序发生.例如,一个列包含:

205
202
Run Code Online (Sandbox Code Playgroud)

将其计算为202与205一起出现(如上面的矩阵所示)但不是205与202 - 重复的倒数.在决定使用哪个数字作为参考时,它应该是最小的.

编辑:

在此输入图像描述

Lui*_*ndo 4

sparse来救援!

让您的数据和所需范围定义为

A = [ 205   204   201
      202   208   202 ]; %// data. Two-row matrix
limits = [200 208]; %// desired range. It needn't include all values of A
Run Code Online (Sandbox Code Playgroud)

然后

lim1 = limits(1)-1;
s = limits(2)-lim1;
cols = all((A>=limits(1)) & (A<=limits(2)), 1);
B = sort(A(:,cols), 1, 'descend')-lim1;
R = full(sparse(B(2,:), B(1,:), 1, s, s));
Run Code Online (Sandbox Code Playgroud)

给出

R =
     0     0     0     0     0     0     0     0     0
     0     0     1     0     0     0     0     0     0
     0     0     0     0     0     1     0     0     0
     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     1
     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0
Run Code Online (Sandbox Code Playgroud)

或者,您可以放弃sort并使用矩阵加法,然后triu获得相同的结果(可能更快):

lim1 = limits(1)-1;
s = limits(2)-lim1;
cols = all( (A>=limits(1)) & (A<=limits(2)) , 1);
R = full(sparse(A(2,cols)-lim1, A(1,cols)-lim1, 1, s, s));
R = triu(R + R.');
Run Code Online (Sandbox Code Playgroud)

两种方法都处理重复的列(直到排序),正确地增加它们的计数。例如,

A = [205   204   201
     201   208   205]
Run Code Online (Sandbox Code Playgroud)

给出

R =
     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     2     0     0     0
     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     1
     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0
Run Code Online (Sandbox Code Playgroud)