请参阅以下问题:
P=rand(4,4);
for i=1:size(P,2)
for j=1:size(P,2)
[r,p]=corr(P(:,i),P(:,j))
end
end
显然,循环将导致相关数量加倍(即corr(P(:,1),P(:,4))和corr(P(:,4),P(:,1) ))。有没有人建议如何避免这种情况?也许没有使用循环?
谢谢!
答案 0 :(得分:1)
我有四个建议,具体取决于您在计算矩阵方面做了什么。我假设您给出的示例是需要完成的简化版本。
您可以做的一件事就是更改j
循环索引,使其仅从1上升到i
。这样,您得到一个较低的三角矩阵,只关注矩阵下三角半部分内的值。上半部分基本上都设置为零。换句话说:
for i = 1 : size(P,2)
for j = 1 : i
%// Your code here
end
end
unique
您可以继续使用与之前完成的两个for
循环相同的矩阵,但您可以使用unique
过滤重复项。换句话说,你可以这样做:
[Y,indices] = unique(P);
Y
会在矩阵P
中为您提供唯一值列表,而indices
将为您提供 在{{1}内的位置}}。请注意,这些是列主要索引,因此如果您想查找这些位置出现位置的行和列位置,您可以执行以下操作:
P
[rows,cols] = ind2sub(size(P), indices);
和pdist
由于您正在寻找不需要循环的解决方案,请查看squareform
函数。给定pdist
矩阵,M x N
将在矩阵中找到每对行之间的距离。然后,pdist
会将这些距离转换为矩阵,就像您在上面看到的那样。换句话说,这样做:
squareform
dists = pdist(P.', 'correlation');
distMatrix = squareform(dists);
方法您可以通过以下方式使用corr
:
corr
在这种情况下, [rho, pvals] = corr(P);
将生成一个corr
矩阵,其中包含m x m
中存储的n x m
矩阵的每对列之间的相关系数。
希望其中一个能奏效!
答案 1 :(得分:0)
这有效吗?
for i=1:size(P,2)
for j=1:i
答案 2 :(得分:0)
由于您只是将每列与另一列相关联,那么为什么不直接使用(直接来自文档)
[Rho,Pval] = corr(P);
我没有统计工具箱,但根据http://www.mathworks.com/help/stats/corr.html,
corr(X)返回一个p-by-p矩阵,其中包含n-by-p矩阵X中每对列之间的成对线性相关系数。