给出大小为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
感谢您的帮助:)
答案 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)
所以我建议你只检查一次:
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会每次都计算它!)