【问题标题】:vandermonde matrix matlab confusion范德蒙德矩阵matlab混淆
【发布时间】:2013-01-25 19:37:05
【问题描述】:

我正在尝试使用 matlab 构造一个vandermonde matrix

我的输入向量是

t = [ 1 2 3 4 ]'

我使用vander function 的输出是:

ans =

 1     1     1     1
 8     4     2     1
27     9     3     1
64    16     4     1

如果我没记错的话,所讨论的向量的范德蒙德矩阵应该是:

1 1 1 1
1 2 4 8
1 3 9 27
1 4 16 64

现在我才意识到我可以使用以下方法达到我想要的结果:

>> fliplr(vander(t))

 ans =

 1     1     1     1
 1     2     4     8
 1     3     9    27
 1     4    16    64

谢谢。

【问题讨论】:

  • Vandermonde 矩阵中列的顺序只影响一件事 - 可能构建的结果模型中多项式系数的顺序。只要您知道结果是什么,以及如何解释它,就可以使用任何一种形式并感到高兴。
  • 作为一般提示:看起来您可以使用bsxfun(@power, t, 0:numel(t)-1);(或者如果您愿意,bsxfun(@power, t, numel(t)-1:-1:0);)来创建比vander 快一个数量级。
  • 就地复制粘贴vander 的内容更快。

标签: matlab interpolation


【解决方案1】:

Wikipedia 和 Mathworld 同意您的观点。但是,MATLAB documentation 表示:

A = vander(v) 返回列是幂的 Vandermonde 矩阵 向量v的,即A(i,j) = v(i)^(n-j),其中n = length(v)。

我不知道 The Mathworks 为什么会这样。您可以使用fliplr 来达到预期的效果。

【讨论】:

  • TMW 这样做是因为他们希望在 polyfit 和 polyval 等工具中降低系数的顺序。这使得他们所有使用多项式和分段多项式(样条、pchip 等)的工具都保持一致。为什么有人首先按此顺序执行此操作很有趣,但可能需要直接询问 Cleve 或 Carl 以获得他们的输入,因为他们肯定是罪魁祸首。我想知道它是否可能与求解中完成的列排列有关,但这只是一个疯狂的猜测。
【解决方案2】:

只需翻转矩阵(左/右)即可获得所需的矩阵。

【讨论】:

  • 我不认为转置会起作用,因为transpose(vander(t)) 将是 [1 8 27 64; 1 4 9 16; 1 2 3 4; 1 1 1 1]