平均Matlab矩阵

时间:2011-08-06 12:41:49

标签: performance matlab matrix

在我使用的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

1 个答案:

答案 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秒。

如果您已经知道这一点,请道歉。