存储数据时,fminsearch在循环中覆盖

我有以下在matlab中提到的代码。 我想把所有的162行和4列写入excel文件。

当我在代码中使用xlswrite时,我只得到一行和四列,因为P的值会在每个迭代步骤中被覆盖。

如果我使用for循环内的另一个循环执行时间急剧增加。 请帮助至less把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; 

你可以修改P行

 P(i,:) = fminsearch(@ObFun,Pini,[],psi,thetaObs); 

P会将每个计算(4个元素向量)存储在一个新行中。

你也可以在P = nan(nn, 4); for循环之前初始化P P = nan(nn, 4);

然后使用xlswrite在Excel文件中写入P

我没有深入研究过你的代码,但据我所知,你有两个select:

  1. 创build一个matrixP并在整个matrix上使用xlswrite 。 这在我看来是最合理的方法。
  2. 在循环中使用xlswrite1中的xlswrite1 。 这会稍稍增加执行时间,但不会像使用常规的xlswrite那样多,因为它是专门devise用于循环内部的。 之所以这么快,是因为它只打开和closures一次Excel文件,而常规的xlswrite打开和closures它,每次调用函数。

你似乎知道如何使用索引,所以我不知道你为什么只是这样做:

 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 

当然,你的代码是不能运行的,所以你将不得不debugging任何其他的小错误。 另外,由于smcdata似乎是一个matrix,而不是一个vector,所以你应该小心使用它的length 。 你可能应该使用size