Matlab高效编程需要注意几点

Matlab高效编程需要注意几点

本文的观点翻译自  umich大学EECS 451课程 DIGITAL SIGNAL PROCESSING & ANALYSIS 提供的matlab快速教程,并结合自己整理,附上代码和说明。练习完教程上的例子,我的感受是实际上,任何时候再优秀的工具也避免不了写出冗余、效率低的代码,关键还得自己去建立问题的逻辑。


matlab高效编程注意几点:

(1)尽量避免使用嵌套循环,很多时候嵌套循环都可以由矩阵操作取代(见下文例子)。

(2)在需要的时候,重新分配(Preallocate)数组空间。

(3)尽量使用内置函数而不是使用自己编写的函数,通常内置函数都比你自己编写的快。

下文提到的两个例子,说明了利用矩阵操作消除嵌套循环的思想,例子中避免循环的方法,基本上都是通过矩阵相乘来生成多个结果(n=1:3或者n=1:20的结果一次性计算)来避免循环的,你可以拿着草稿纸,计算计算。



例子1: 计算当 n = 1,2,3时下式中y(n)的值,其中x,h都是已知的列向量。


Matlab高效编程需要注意几点_第1张图片

方法一: 双层嵌套循环

function [ y ] = func1( h,x )
    %use nested loops 
    y = zeros(1,3);
    for n = 1:3
        for k = 0:19
        y(n)= y(n)+h(k+1)*x(n+k);
        end
    end
end


方法二:一层循环

function [ y ] = func2( h,x )
    %use one loops 
    y = zeros(1,3);
    for n = 1:3
        y(n) = h'*x(n:(n+19));
    end
end


方法三:使用了两矩阵相乘,避免循环

function [ y ] = func3( h,x )
    %use matrix multiplication
   X = [x(1:20),x(2:21),x(3:22)];
   y = h'*X;
end


调用及运行过程如下:

>> h = 1:20;h = h';
>> x = 1:30;x = x';
>> func1(h,x)'

ans =

        2870
        3080
        3290

>> func2(h,x)'

ans =

        2870
        3080
        3290

>> func3(h,x)'

ans =

        2870
        3080
        3290


例子2: 计算 n =1:20 时如下函数的值。

方法一:双层嵌套循环

function [ y ] = getY1( N )
% calculate y(n) = 1^3*(1^3+2^3)*(1^3+2^3+3^3)....*(1^3+2^3+...+n^3)
%use nested loop
    y = zeros(N,1);
    temp  = 0;
    y(1) = 1;
    for n = 2:N
      for m = 1:n
         temp = temp + m^3;
      end
      y(n) = y(n-1)*temp;
      temp  = 0;
    end
end


方法二:单层循环

function [ y ] = getY2( N )
% calculate y(n) = 1^3*(1^3+2^3)*(1^3+2^3+3^3)....*(1^3+2^3+...+n^3)
 y = zeros(N,1);
 y(1) = 1;
 for n = 2:N
     temp = 1:n;
     y(n) = y(n-1)*sum(temp.^3);
 end
end


方法三:避免循环

function [ y ] = getY5( N )
% calculate y(n) = 1^3*(1^3+2^3)*(1^3+2^3+3^3)....*(1^3+2^3+...+n^3)

 X = tril(ones(N)*diag(1:N));
 x = sum(X.^3,2);
 Y = tril(ones(N)*diag(x))+triu(ones(N)) -eye(N);
 y = prod(Y,2);
end


方法四:自己写的单循环

function [ y ] = getY4(N)
% calculate y(n) = 1^3*(1^3+2^3)*(1^3+2^3+3^3)....*(1^3+2^3+...+n^3)
y = zeros(N,1);
for n = 1:N
    X = tril(ones(n));
    A = 1:n;
    A = A.^3;
    Y = prod(X*A');
    y(n) = Y;
end
end

方法五: 自己写的,避免循环

function [ y ] = getY3( N )
% calculate y(n) = 1^3*(1^3+2^3)*(1^3+2^3+3^3)....*(1^3+2^3+...+n^3)
%a little complex ,try to make it simple
y = zeros(N,1);
F = tril(ones(N));
G = 1:N;
G = (G.^3)';
D = diag(F*G);
E = triu(ones(N));
C = tril(ones(N))-eye(N);
B = D*E + C;
y = prod(B);
y = y';
end


运行过程:

>> getY1(4)'

ans =

           1           9         324       32400

>> getY2(4)'

ans =

           1           9         324       32400

>> getY3(4)'

ans =

           1           9         324       32400

>> getY4(4)'

ans =

           1           9         324       32400

>> getY5(4)'

ans =

           1           9         324       32400


你可能感兴趣的:(Matlab高效编程需要注意几点)