如何在Octave中循环矩阵以生成n阶的交叉项多项式

问题描述 投票:0回答:1

我要做的是以下,我有一个n x m大小的矩阵,有n行数据和m列。这些列中的每一列都是一个不同的变量(想想X,Y,Z,等等......)。

我想要的是输出n x (m+f(m, i))矩阵,其中i是所请求的多项式的阶数,f(m, i)是项的数量,包括多项式的交叉项。

我举一个例子,说我有一行有三行,我希望将多项式项最多返回3阶。

input = [x, y, z]

我想去

output = [x, y, z, x^2, y^2, z^2, x*y, x*z, y*z, x^3, y^3, z^3, x^2y, x^2*z, x*y^2, y^2*z, x*z^2, y*z^2, x*y*z]

从这里我们看到f(3, 3) = 16

我知道我可以用m个嵌套循环来做这个,我相信我可以在行数上对任何算法进行矢量化,但是有一个比暴力更有效的算法是有帮助的。

algorithm octave linear-algebra polynomial-math
1个回答
0
投票

这可以使用以下代码以数字方式完成,也应该很容易象征性地进行。

function MatrixWithPolynomialTerms = GeneratePolynomialTerms

(InputDataMatrix, n)
  resultMatrix = InputDataMatrix;

  [nr, nc] = size(InputDataMatrix);

  cart  = nthargout ([1:nc], @ndgrid, [0:n]);
  combs = cell2mat (cellfun (@(c) c(:), cart, "UniformOutput", false))';

  for i = 1:length(combs)
    if (sum(combs(:, i)) <= n)
      resultColumn = ones(nr, 1);
      for j = 1:nc
        resultColumn.*=(InputDataMatrix(:, j).^combs(j, i));
      end
      resultMatrix = [resultMatrix, resultColumn];
    end
  end
  MatrixWithPolynomialTerms = resultMatrix
endfunction
© www.soinside.com 2019 - 2024. All rights reserved.