在实现最小二乘法做n次多项式拟合的时候,有这么一段我认为写得比较好的向量化代码,实验结果拟合速度甚至比matlab自带的polyfit函数还快一些。- function coef=fitt(x, y, n)m = length(x);A = repmat(x', 1, 2*n);c = repmat(1:2*n, m, 1);vector =[m, sum(A.^c)];index = meshgrid(1:n+1);index = bsxfun(@plus,index, [0:n]');B =[ones(1,m); repmat(x, n,1)];cc = repmat([1,1:n]', 1, m);b = sum(B.^cc * y', 2);coef = fliplr((vector(index)\b)');
复制代码 上述函数完成最小二乘法算法计算后为了保持与matlab自带函数一样的输出格式,还另外将计算结果经装置与filplr函数处理。
亮点在于在构造方程组的系数矩阵时并没有直接用循环来构造每一个元素,而是生成了一个很有规律的系数向量,再向量化生成索引矩阵来最后生成系数矩阵。
与polyfit函数对比:- x = linspace(0,1,5);y = 1./(1+x);ticp1 = polyfit(x,y,4)tocticp2 = fitt(x,y,4)tocp1 = 0.1524 -0.5333 0.8667 -0.9857 1.0000时间已过 0.003473 秒。p2 = 0.1524 -0.5333 0.8667 -0.9857 1.0000时间已过 0.000757 秒。>>
复制代码 |