我在matlab中有下面提到的代码。我想将所有162行和4列计算成excel文件。
当我在代码中使用xlswrite时,我只得到一行和4列,因为P的值会在每个迭代步骤中被覆盖。
如果我在for循环中使用另一个循环,则执行时间会急剧增加。请帮助最少将P的值写入一个数组,我可以稍后将其写入excel文件(当我尝试'在赋值A(I)= B时,B和I中的元素数必须相同'出现错误' 。)
请帮助
function FitSMC_BC
clc
% Parameters: P(1)=theta_S; P(2)=theta_r; P(3)=psib; P(4)=lamda;
smcdata=xlsread('asimdata');
nn=length(smcdata)-1;
for i=1:nn
psi=smcdata(:,1);
thetaObs=smcdata(:,i+1);
%Make an initial guess:
Pini=[0.5 0.1 -1 1.5];
P=fminsearch(@ObFun,Pini,[],psi,thetaObs);
disp(['result',num2str(i),': P=',num2str(P)]);
theta=Gettheta(P,psi);
end
function OF=ObFun(P,psi,thetaObs)
theta=Gettheta(P,psi);
OF=sqrt(mean((theta - thetaObs).^2));
function theta=Gettheta(P,psi)
SoilPars.theta_S=P(1);
SoilPars.theta_r=P(2);
SoilPars.psib=P(3);
SoilPars.lamda=P(4);
[theta]=thetaFun(psi,SoilPars);
function [theta]=thetaFun(psi,SoilPars)
theta_S=SoilPars.theta_S;
theta_r=SoilPars.theta_r;
psib=SoilPars.psib;
lamda=SoilPars.lamda;
theta=theta_r+((theta_S-theta_r)*((psib./psi).^lamda));
theta(psi>psib)=theta_S;
答案 0 :(得分:1)
我没有深入研究过您的代码,但据我所知,您有两种选择:
P
并在整个矩阵上使用xlswrite
。在我看来,这似乎是最合理的方法。xlswrite1
中的fileexchange。这会稍微增加执行时间,但不会像使用常规xlswrite
那样多,因为它是专门设计用于循环内部的。之所以如此快,是因为它只打开和关闭Excel文件一次,而常规xlswrite
每次调用函数时都会打开并关闭它。 答案 1 :(得分:1)
您可以使用
修改P行P(i,:) = fminsearch(@ObFun,Pini,[],psi,thetaObs);
P
会将每个计算(4个元素向量)存储在一个新行中。
您也可以在使用P
for
循环之前初始化P = nan(nn, 4);
然后使用P
在Excel文件中编写xlswrite
。
答案 2 :(得分:1)
你似乎知道如何使用索引,所以我不确定你为什么只是做这样的事情:
P = zeros(size(smcdata,1),nn)
for i=1:nn
...
P(:,i) = fminsearch(@ObFun,Pini,[],psi,thetaObs);
disp(['result',num2str(i),': P=',num2str(P(:,i))]);
theta = Gettheta(P(:,i),psi); % Why is this here? Are you writing it to file too?
end
xlswrite('My_FileName.xls',P);
或者你可以在循环的每次迭代中调用xlswrite
(可能更慢)并使用以下内容附加新数据:
for i=1:nn
...
P = fminsearch(@ObFun,Pini,[],psi,thetaObs);
disp(['result',num2str(i),': P=',num2str(P)]);
theta = Gettheta(P,psi); % Why is this here? Are you writing it to file too?
xlswrite('My_FileName.xls',P,1,['A' int2str((i-1)*size(P,2)+1)]);
end
当然,您的代码不可运行,因此您必须调试任何其他小错误。此外,由于smcdata
似乎是一个矩阵而不是一个向量,因此您应该小心使用length
。您可能应该使用size
。