【问题标题】:Remove duplicates in correlations in matlab在matlab中删除相关性中的重复项
【发布时间】:2014-08-12 23:31:21
【问题描述】:

请看以下问题:

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

谢谢!

【问题讨论】:

    标签: matlab loops correlation


    【解决方案1】:

    这行得通吗?

    for i=1:size(P,2)
    for j=1:i
    

    【讨论】:

      【解决方案2】:

      既然您只是将每一列与另一列相关联,那么为什么不直接使用(直接来自文档)

      [Rho,Pval] = corr(P);  
      

      我没有统计工具箱,但是根据http://www.mathworks.com/help/stats/corr.html

      corr(X) 返回一个 p×p 矩阵,其中包含 n×p 矩阵 X 中每对列之间的成对线性相关系数。

      【讨论】:

      • 确实如此。我在我的问题中没有提到的是相关性实际上是稍后完成的,循环也用于其他事情。不过谢谢。
      【解决方案3】:

      我有四个建议给您,具体取决于您计算矩阵的具体操作。我假设您提供的示例是需要完成的操作的简化版本。

      第一种方法——调整内循环索引

      您可以做的一件事是更改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 将为您提供这些值在P 中的位置。请注意,这些是主要索引,因此如果您想找到这些位置所在的行和列位置,您可以这样做:

      [rows,cols] = ind2sub(size(P), indices);
      

      第三种方法 - 使用 pdistsquareform

      由于您正在寻找不需要循环的解决方案,请查看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 矩阵存储在P 中。


      希望其中一个能奏效!

      【讨论】:

      • 非常感谢。由于我的代码的性质,第一种方法效果最好。该示例只是一个简化版本。
      • @A.Rainer - 不客气。很高兴我能帮上忙!
      猜你喜欢
      • 2018-07-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      相关资源
      最近更新 更多