【问题标题】:Build a matrix from a vector containing the maximum of each possible pair从包含每个可能对的最大值的向量构建矩阵
【发布时间】:2012-03-11 16:48:01
【问题描述】:

给定一个大小为 n 的向量

A=[2 2 5 1] % n=4

构建一个大小为 nxn 的矩阵 R,其中与元素 (i,j) 对应的值是 A(i) 和 A(j) 之间的最大值

R = 
    2     2     5     2
    2     2     5     2
    5     5     5     5
    2     2     5     1 

我正在使用 for 循环执行此操作。有没有更有效的方法?

 R = zeros(size(a,2))
 for i=1:size(R,1)
    for j=1:size(R,2)
        R(i,j) = max(A(i),A(j));
    end
 end

感谢您的帮助:)

【问题讨论】:

    标签: performance matlab vector matrix indexing


    【解决方案1】:

    这是一个扩展评论,而不是一个答案......我已经失去了与我的开发服务器的连接,所以认为浪费一些时间是合适的。我定义了一个包含代码的脚本文件:

    A=1:1500; % bigger vector for stable timing
    tStart = tic;
    R = zeros(size(A,2));
     for i=1:size(R,1)
        for j=1:size(R,2)
            R(i,j) = max(A(i),A(j));
        end
    end
    tElapsed = toc(tStart)
    

    另一个脚本包含:

    A=1:1500;
    tStart = tic;
    B=ones(size(A))'*A;
    R=max(B,B');
    tElapsed = toc(tStart)
    

    第三个包含:

    A=1:1500;
    tStart = tic;
    r=size(A,2);
    R=ones(r);
    for i=1:r
       for j=(i+1):r
           R(i,j)=max(A(i),A(j));
           R(j,i)=R(i,j);
       end
    R(i,i)=A(i);
    end
    tElapsed = toc(tStart)
    

    并且每个运行 5 次。平均 tElapseds 为:1.7674s、0.0520s、0.0645s,所以@Johan Lundberg 的回答为(时间)效率赢得了桂冠。

    为了完整起见,我定时@woodchips 回答;平均经过时间为 0.0206 秒。 @Johan 遭受了荣誉从他的额头上夺走的耻辱。

    【讨论】:

      【解决方案2】:

      好吧,老实说,真正的 MATLAB 方式并不是 Johan 所建议的。这甚至不是最快的方法。以真正的 MATLAB 方式使用 bsxfun 快三倍。

      >> A= rand(1,1000);
      
      >> tic,B=ones(size(A))'*A;R=max(B,B');toc
      Elapsed time is 0.027081 seconds.
      
      >> tic,R = bsxfun(@max,A',A);toc
      Elapsed time is 0.006306 seconds.
      

      【讨论】:

      • 现在更加开明了。谢谢!
      • 有趣!不知道 bsxfun 可以处理这样的向量。
      【解决方案3】:
      1. 您的矩阵始终是对称的,因为 max {A(i), A(j)}= max {A(j),A(i)}。这样您就可以将支票减少一半。
      2. 您的对角线始终是您的输入向量。诊断(R) = A

      所以我建议你只检查一次:

      r=size(A,2)
      R=ones(r)
      for i=1:r
         for j=(i+1):r
             R(i,j)=max(A(i),A(j))
             R(j,i)=R(i,j)
         end
      R(i,i)=A(i)
      end
      

      (保存你的 size(A,2) 因为它在输入后不会改变,否则 matlab 每次都会计算它!)

      【讨论】:

        【解决方案4】:

        这至少是一种更 matlaby 的方式:

        B=ones(size(A))'*A
        R=max(B,B')
        

        我希望它会快很多。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-05
          • 2021-04-02
          • 1970-01-01
          • 2017-11-18
          • 2018-10-14
          相关资源
          最近更新 更多