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

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

0 голосов
/ 17 сентября 2018

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

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
...