Как зациклить матрицу в 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