我有一个矩阵(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 - 重复的倒数.在决定使用哪个数字作为参考时,它应该是最小的.
编辑:

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)