考虑以下代码,它构成一个随机数据集,并根据数据拟合1到5阶的多项式:
x=1:100;
data=exp(-rand(1).*x);
for ii = 1:1:5;
polyfit(x,data,ii);
end
我想知道在每个循环中存储polyfit系数的最优雅方法是什么?我想
fitCoef(ii,:) = polyfit(x,data,ii)
会有效,但我在Subscripted assignment dimension mismatch.
次迭代时遇到ii = 2
错误。我理解为什么,因为它试图将3个值的向量放入一个长度仅为2的向量中......但我不确定如何正确解决这个问题。
我的理想输出是一个矩阵,显示每行的系数,例如。
p(1) p(2)
p(1) p(2) p(3)
p(1) p(2) p(3) p(4)
但我不知道如何处理黑色空间?
由于
答案 0 :(得分:3)
你也可以完全跳过for循环:
A = cellfun(@(degree) polyfit(x, data, degree), num2cell(1:5), 'UniformOutput', false);
答案 1 :(得分:1)
您可以在开始循环之前使用fitCoeffs=zeros(5,6)
初始化零矩阵。这不会影响polyval
。
您也可以将结果保存到单元格数组fitCoeffs{ii}=polyfit(x,data,ii)
中,然后使用每组系数,例如polyval(fitCoeffs{3},X)
。
我已经在下面说明了两个选项:
x=1:100;
data=exp(-rand(1).*x);
N=5;
P=zeros(N,N+1);
P2=cell(1,N);
for ii = 1:N;
P(ii,1:ii+1)=polyfit(x,data,ii);
P2{ii}=polyfit(x,data,ii);
end
P
P2
polyval(P(3,:),1)
polyval(P(3,1:4),1) % Note it doesn't matter if you leave the zeros in
polyval(P2{3},1)