是否有任何通用方法可以为任何值填充此矩阵:
或者,使用 Vandermonde 矩阵计算多项式系数可能更容易?
我将不胜感激任何建议和 Fortran 代码。
是否有任何通用方法可以为任何值填充此矩阵:
或者,使用 Vandermonde 矩阵计算多项式系数可能更容易?
我将不胜感激任何建议和 Fortran 代码。
是一个矩阵。可以通过以下方式获得:
请注意,分解不涉及任何求和,并且可以使用简单的索引和幂运算轻松计算。矩阵乘法是计算最终矩阵的有效算子. 这既有效又易于实施。
右边的矩阵只是一个添加了列(最右边)的Vandermonde 矩阵。这是实现此功能的 MATLAB 2-liner:
% x is the input column vector, n is the number of elements e.g. n=length(x)
W = [ fliplr(vander(x)) (x.^n)];
A = W'*W;
这应该比 MATLAB 中的 for 循环更快,因为vander
函数不包含任何循环。它也绝对更短更干净。
我认为在这里快速发表评论很重要。与普遍的看法不同,当正确实施矩阵乘法时,, 但. 许多可用的软件包已经非常优化。使用向量指令集以及并行化带来了进一步的加速。然而,理论上的复杂性从未达到这是通过for循环实现的。这种方法在 MATLAB 中仅适用于小型矩阵(高达 ~ N<1500)。
还要注意,即使这里使用了矩阵表示法,乘法仍然可以从这些矩阵的特殊结构中受益。如果要利用这一特性,可以获得类似的复杂性。
您可以使用 for 循环轻松完成此操作。只需用于n
定义您的循环限制。这是 MATLAB 的全功能解决方案(只需先定义 n 和 x):
%pre-allocate A
A = zeros(n+1);
%first row:
for j=0:n
A(1,j+1)=sum(x.^j);
end
%rows 2 through n
for i=1:n
A(i+1,1:n)=A(i,2:n+1); %copy from previous row
A(i+1,n+1)=sum(x.^(n+i)); %compute last entry in row
end
此方法需要(2*n+1)*(2*numel(x))
操作,因此如果x
有大约n
值该方法是。