如何在Matlab中加速计算

时间:2014-01-27 00:03:26

标签: matlab

我正在尝试计算矩阵中单元格的所有参数,然后使用colormap散射函数和videowriter制作视频。我的代码很好,但是当我使用更高的n = 64和N = 241时,计算时间很长。

%% Implementing time loop
for k=2:N
    for i=1:n
        for j=1:n
            cell(i,j,k).threshold=cell(i,j,k-1).threshold+(-H1*M/P+cell....
                (i,j,k-1).activity*(H1+H2*cell(i,j,k-1).input)/D)*0.25;
            cell(i,j,k).exc_level=cell(i,j,k-1).exc_level+....
                ((cell(i,j,k-1).input+cell(i,j,k-1).exc_level)/K)*0.25;
            if cell(i,j,k-1).activity==0 &&....
                    cell(i,j,k).exc_level>cell(i,j,k).threshold
                cell(i,j,k).activity=1;
            elseif cell(i,j,k-1).activity==1 && cell(i,j,k-6).activity==0
                cell(i,j,k).activity=1;
            else
                cell(i,j,k).activity=0;
            end;
        end;
    end;
    for i=1:n
        for j=1:n
            [Z_coord1,Z_coord2,Z_act,Z_exc]=dendrite5(cell,i,j,n,k);
            cell(i,j,k).input=sum(Z_act.*Z_exc);
        end;
    end;
end;

我想计算n = 64和N = 241的时间循环。你能建议我加快代码的方法。另外我认为主要问题在于函数dendrite5。所以这是功能:

function [Z_coord1,Z_coord2,Z_act,Z_exc]=dendrite5(cell,i_0,j_0,n,k)

Z_coord1=zeros(1,i_0+6);
Z_coord2=zeros(1,i_0+6);
Z_act=zeros(1,i_0+6);
Z_exc=zeros(1,i_0+6);

for i=i_0-6:i_0+6
    for j=j_0-6:j_0+6
        [i_hex_0,j_hex_0]=grid2hex(i_0,j_0);
        [i_hex,j_hex]=grid2hex(i,j);
        [i_card,j_card]=hex2card(i_hex,j_hex);
        [i_0_card,j_0_card]=hex2card(i_hex_0,j_hex_0);
        if (i_card-i_0_card)^2+(j_card-j_0_card)^2<1.70^2
            [i_centered,j_centered]=boundary2(i,j,n);
            d=sqrt((i_card-i_0_card)^2+(j_card-j_0_card)^2);
            w=(2*0.85^2*acos(d/(2*0.85))-0.5*sqrt(4*0.85^2-d^2))/pi*0.85^2;
            Z_coord1=[Z_coord1 i_centered];
            Z_coord2=[Z_coord2 j_centered];
            Z_act=[Z_act cell(i_centered,j_centered,k).activity];
            Z_exc=[Z_exc w];
        end;
    end;
end;
% Z_coord1=Z_coord1(Z_coord1~=0);
% Z_coord1=Z_coord1(Z_coord1~=0);
% Z_coord1=Z_coord1(Z_coord1~=0);
% Z_coord1=Z_coord1(Z_coord1~=0);

[代码格式化]

2 个答案:

答案 0 :(得分:0)

尝试对代码进行矢量化。 MATLAB不编译代码。这是一名翻译。因此,

a = 1:1000000;
for i = a
   n = n+i;
end

慢于

a = 1:1000000;
sum(a)

如果您真的在加速编写代码,请查看MEX文件(http://www.mathworks.com/help/matlab/create-mex-files.html)。它们允许您编写和编译C和C ++代码,编译它并作为Matlab函数运行,就像那些快速内置的代码一样。

答案 1 :(得分:0)

尝试在for循环之外初始化变量。这可能有所帮助。

具体来说,看看你的手机和你的Z_coord。我提到了最后一个,因为你在做

时附加到数组
Z_coord1 = [Z_coord1 i_center];

因此它不断增长。如果它变得“太大”,Matlab会显着减慢。相同的语句适用于您的单元格变量(这是3个nexted for循环)。如果在for循环外创建它们,则已分配空间。