2

我在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;
4

3 回答 3

1

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

  1. 创建一个矩阵Pxlswrite在整个矩阵上使用。在我看来,这似乎是最合理的方法。
  2. xlswrite1在循环中从文件交换中使用。这会稍微增加执行时间,但不会像使用常规的那样多,xlswrite因为它是专门设计用于循环内部的。它之所以如此之快,是因为它只打开和关闭 Excel 文件一次,而常规xlswrite程序每次调用该函数时都会打开和关闭它。
于 2014-02-22T00:31:50.343 回答
1

您可以修改 P 线

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

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

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

然后P使用xlswrite.

于 2014-02-22T00:32:00.613 回答
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.

于 2014-02-22T00:35:37.053 回答