删除matlab中相关性的重复项

时间:2014-06-23 01:05:01

标签: matlab loops correlation

请参阅以下问题:

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) ))。有没有人建议如何避免这种情况?也许没有使用循环?

谢谢!

3 个答案:

答案 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中每对列之间的成对线性相关系数。