Как зациклить матрицу в Octave, чтобы сгенерировать межчленный полином порядка n

Я пытаюсь сделать следующее: у меня есть матрица размером 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,

Я знаю, что могу сделать это с помощью вложенных циклов, и я верю, что я могу векторизовать любой алгоритм по количеству строк, но было бы полезно иметь более эффективный алгоритм, чем перебор.

1 ответ

Решение

Это можно сделать численно с помощью следующего кода, это должно быть довольно легко сделать символически.

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
Другие вопросы по тегам