我正在尝试计算矩阵中单元格的所有参数,然后使用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);
[代码格式化]
答案 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循环外创建它们,则已分配空间。