在我使用的Matlab程序中,我经常需要在矩阵内进行平均(插值)。最直接的方法是添加矩阵和移位矩阵(avg)。但是,您可以使用矩阵乘法(avg2)执行相同的操作。在大矩阵的情况下,我注意到在使用矩阵乘法的情况下速度显着增加。
有人能解释为什么Matlab能够比添加相同的矩阵更快地处理这种乘法吗?对于avg()?
,使用avg2()的可能缺点是什么?在这种情况下,运行时间差异为6(n = 500)。
function [] = speed()
%Speed test for averaging a matrix
n = 500;
A = rand(n,n);
tic
for i=1:100
avg(A);
end
toc
tic
for i=1:100
avg2(A);
end
toc
end
function B = avg(A,k)
if nargin<2, k = 1; end
if size(A,1)==1, A = A'; end
if k<2, B = (A(2:end,:)+A(1:end-1,:))/2; else B = avg(A,k-1); end
if size(A,2)==1, B = B'; end
end
function B = avg2(A,k)
if nargin<2, k = 1; end
if size(A,1)==1, A = A'; end
if k<2,
m = size(A,1);
e = ones(m,1);
S = spdiags(e*[1 1],-1:0,m,m-1)'/2;
B = S*A; else B = avg2(A,k-1); end
if size(A,2)==1, B = B'; end
end
答案 0 :(得分:3)
我担心我无法回答你正在使用的功能的内部工作原理。然而,由于它们看起来过于复杂,我觉得我应该让你意识到这种平均化的方法更简单(也更快)。
您可以使用内核为[0.5; 0.5]的conv2。我在下面扩展了你的代码:
function [A, T1, T2 T3] = speed()
%Speed test for averaging a matrix
n = 900;
A = rand(n,n);
tic
for i=1:100
T1 = avg(A);
end
toc
tic
for i=1:100
T2 = avg2(A);
end
toc
tic
for i=1:100
T3 = conv2(A,[1;1]/2,'valid');
end
toc
if sum(sum(abs(T3-T2))) > 0
warning('Method 3 not equal the other methods')
end
end
function B = avg(A,k)
if nargin<2, k = 1; end
if size(A,1)==1, A = A'; end
if k<2, B = (A(2:end,:)+A(1:end-1,:))/2; else B = avg(A,k-1); end
if size(A,2)==1, B = B'; end
end
function B = avg2(A,k)
if nargin<2, k = 1; end
if size(A,1)==1, A = A'; end
if k<2,
m = size(A,1);
e = ones(m,1);
S = spdiags(e*[1 1],-1:0,m,m-1)'/2;
B = S*A; else B = avg2(A,k-1); end
if size(A,2)==1, B = B'; end
end
结果:
经过的时间是10.201399秒。
经过的时间是1.088003秒。
经过的时间是1.040471秒。
如果您已经知道这一点,请道歉。