如何循环遍历 Octave 中的矩阵以生成 n 阶交叉项多项式
How to loop over matrix in Octave to generate cross-term polynomial of order n
我想要做的是以下内容,我有一个 n x m 大小的矩阵,有 n 行数据和 m 列。这些列中的每一列都是一个不同的变量(想想 X、Y、Z 等...)。
我想要的是输出一个n x (m+f(m, i))
矩阵,其中i是请求多项式的阶数,f(m, i)
是项数,包括多项式的交叉项。
我举个例子,假设我有一个一行三列的矩阵,我想 return 多项式项到 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 个嵌套循环来做到这一点,而且我相信我可以根据行数对任何算法进行矢量化,但是拥有比蛮力更有效的算法会很有帮助。
这可以使用以下代码以数字方式完成,也应该很容易以符号方式完成。
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
我想要做的是以下内容,我有一个 n x m 大小的矩阵,有 n 行数据和 m 列。这些列中的每一列都是一个不同的变量(想想 X、Y、Z 等...)。
我想要的是输出一个n x (m+f(m, i))
矩阵,其中i是请求多项式的阶数,f(m, i)
是项数,包括多项式的交叉项。
我举个例子,假设我有一个一行三列的矩阵,我想 return 多项式项到 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 个嵌套循环来做到这一点,而且我相信我可以根据行数对任何算法进行矢量化,但是拥有比蛮力更有效的算法会很有帮助。
这可以使用以下代码以数字方式完成,也应该很容易以符号方式完成。
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