从包含每个可能对的最大值的向量构建矩阵

时间:2012-02-21 11:08:36

标签: performance matlab vector matrix indexing

给出大小为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

感谢您的帮助:)

4 个答案:

答案 0 :(得分:4)

这至少是一种更具马铃薯的方式:

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

我希望它快得多。

答案 1 :(得分:3)

嗯,说实话,真正的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.

答案 2 :(得分: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遭受了从他的额头中夺走桂冠的耻辱。

答案 3 :(得分:0)

  1. 您的矩阵始终是对称的,因为max {A(i),A(j)} = max {A(j),A(i)}。所以你可以减少一半的支票。
  2. 您的对角线始终您的输入向量。 diag(R)= A
  3. 所以我建议你只检查一次:

    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
    

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