首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要提高性能的90年数据模拟

需要提高性能的90年数据模拟
EN

Code Review用户
提问于 2014-08-06 18:55:12
回答 2查看 192关注 0票数 6

我为我的主项目开发了一些代码,它将使用1000个不同的数据集来模拟90年的每日数据。代码运行良好,给出了我想要的正确输出,但处理时间非常长。大约花了8个小时才完成模拟。

代码语言:javascript
复制
    tic
%% importing the csv file with selected column
files=dir('*_scen_*.csv');
for i=1:length(files);
    LHR=importcsv(files(i).name);

%% Definable variables
% Define These Value
TAW=-216;     %total available water
RAW=-129;     %readily available water
KC=1.0;       %crop coefficient
IRL=15;       %intense rain level
RC=(80/100);  %percentage of recharge 
RO=(1-RC);    %percentage of runoff

% The very first row of Soil Moisture Deficit
for j=1
    SMD(j,i)=(LHR.RAIN(j)-LHR.PET(j));
 if     SMD(j,i)>0;
        SMD(j,i)=0;
 elseif SMD(j,i)<RAW;
        SMD(j,i)=(LHR.RAIN(j)-(LHR.PET(j)*((TAW-SMD(j-1))/(TAW-RAW))));
 end
end

%for the following SMD Calculation
for k=2:(length(LHR.RAIN));
    SMD(k,i)=SMD(k-1,i)+(LHR.RAIN(k)-LHR.PET(k));
    % The SMD conditions
    if SMD(k,i)>0;
       SMD(k,i)=0;
 elseif SMD(k,i)<RAW;
     SMD(k,i)=SMD(k-1,i)+(LHR.RAIN(k)-(LHR.PET(k)*((TAW-SMD(k-1,i))/(TAW-RAW))));
    end
end
%Convert negative SMD to Positive
SMD=abs(SMD);

 %%Evapotranspiration Calculation
 for l=1:(length(SMD));
    if SMD(l,i)<abs(RAW);
        AET(l,i)=LHR.PET(l);
    elseif SMD(l,i)>abs(RAW);
        AET(l,i)=KC*LHR.PET(l)*((abs(TAW)-(SMD(l,i)))/(abs(TAW)-abs(RAW)));
    end
end
for m=2:(length(SMD));
    if SMD(m,i)<abs(RAW);
        AET(m,i)=LHR.PET(m);
    elseif SMD(m,i)>abs(RAW);
       AET(m,i)=KC*LHR.PET(m)*((abs(TAW)-(SMD(m-1,i)))/(abs(TAW)-abs(RAW)));
    end
end
%% HER calculation
for n=1:length(SMD);
    if SMD(n,i)<(LHR.RAIN(n)-AET(n,i));
        HER(n,i)=(LHR.RAIN(n)-AET(n,i)-SMD(n,i));
    elseif SMD(n,i)>(LHR.RAIN(n)-AET(n,i));
        HER(n,i)=0;
    end
end
%% Calculation of recharge anf runoff
for o=1:(length(HER));
    if (HER(o,i)+(abs(TAW)-SMD(o,i)))<abs(TAW);
        RUNOFF(o,i)=0;
    elseif (HER(o,i)+(abs(TAW)-SMD(o,i)))>abs(TAW);
        if HER(o,i)>IRL;
            RUNOFF(o,i)=RO*HER(o,i);
        elseif HER(o,i)<IRL;
            RUNOFF(o,i)=0;    
        end
    end
    if (HER(o,i)+(abs(TAW)-SMD(o,i)))<abs(TAW);
        RECHARGE(o,i)=0;
    elseif (HER(o,i)+(abs(TAW)-SMD(o,i)))>abs(TAW);
        if HER(o,i)>IRL;
            RECHARGE(o,i)=RC*HER(o,i);
        elseif HER(o,i)<IRL;
            RECHARGE(o,i)=HER(o,i);
        end
    end
end
%% rainfall
for p=1:length(LHR.RAIN);
RAINFALL(p,i)=LHR.RAIN(p);
PET(p,i)=LHR.PET(p);
end

end
clear i
clear j
clear k
clear l
clear m
clear n
clear o
clear p

toc

此代码是否有任何可减少处理时间的改进范围?对不起,如果代码看上去不专业,我正处于MATLAB编程的初级阶段。

EN

回答 2

Code Review用户

发布于 2014-08-06 20:04:42

最后的这个清理代码表明了这个程序的问题:

清我清j清k清L清m清n清o清p

没有人会逆向工程你的微小/模糊的代码来理解它。如果过了几个星期,你可能会很难理解它。因此,程序是不可维护的。

我对结果的正确性也没有太大的信心。代码应该被分解成函数,每个函数都有一个单一的用途、特定的输入和输出,并且是单独的可测试的。

票数 10
EN

Code Review用户

发布于 2014-08-07 03:34:51

您可以在MATLAB中定义函数,方法是创建名为functionname.m的文件,其内容如下:

代码语言:javascript
复制
% the 'g' is the return value, 'sigmoid' is the function name and
% 'z' is the only parameter
function g = sigmoid(z)

g = zeros(size(z));
g = 1./ (1 + exp(-z));

end

另一个可以大大加快MATLAB的一般思想是向量化:当你有两个数组,然后把它们的内容相乘并加起来,这也可以用向量乘法(和类似的矩阵乘法)来完成。但是,虽然结果是相同的,但是向量变量的执行时间要好得多。

(我同意200_success的观点-你应该用一些有意义的东西来命名你的变量,这样我们才能真正理解正在发生的事情)

另一个问题是缩进:乍一看,我没有看到最外层的for循环。

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

https://codereview.stackexchange.com/questions/59282

复制
相关文章

相似问题

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