首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Matlab中加速计算

如何在Matlab中加速计算
EN

Stack Overflow用户
提问于 2014-01-27 08:03:26
回答 2查看 56关注 0票数 0

我正在尝试计算矩阵中单元格的所有参数,然后使用色彩映射表散射函数和视频写入器制作视频。我的代码很好,但是当我使用更高的n=64和N=241值时,它会花费很长的计算时间。

代码语言:javascript
复制
%% 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。下面是函数:

代码语言:javascript
复制
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);

代码已格式化

EN

回答 2

Stack Overflow用户

发布于 2014-01-27 08:22:54

尝试向量化你的代码。MATLAB不编译代码。它是一个解释器。因此,

代码语言:javascript
复制
a = 1:1000000;
for i = a
   n = n+i;
end

代码语言:javascript
复制
a = 1:1000000;
sum(a)

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

票数 0
EN

Stack Overflow用户

发布于 2014-01-28 04:40:22

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

具体来说,请查看您的手机和Z_coord。我之所以提到最后一个,是因为当您这样做时,您将追加到数组中

代码语言:javascript
复制
Z_coord1 = [Z_coord1 i_center];

因此,它一直在增长。如果它变得“太大”,Matlab会显著减慢速度。同样的语句也适用于您的cell变量(这在3nexted for循环中)。如果在for循环之外创建它们,则已经分配了空间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21370985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档