使用多项式展开矩阵

时间:2012-10-07 02:53:05

标签: matlab matrix polynomial-math

假设我有一个包含3列c1c2c3的矩阵A.

1 2 9
3 0 7
3 1 4

我想要一个新的维度矩阵(3x3n),其中第一列为c1,第二列为c1^2,n列为c1^n,n + 1列为c2,n + 2列为c2^2,依此类推。在MATLAB中有快速的方法吗?

3 个答案:

答案 0 :(得分:3)

结合PERMUTEBSXFUNRESHAPE,您可以非常轻松地执行此操作,使其适用于任何大小的A。为了清楚起见,我已将指令分开,如果需要,可以将它们组合成一行。

n = 2;
A = [1 2 9; 3 0 7; 3 1 4];
[r,c] = size(A);

%# reshape A into a r-by-1-by-c array
A = permute(A,[1 3 2]);

%# create a r-by-n-by-c array with the powers
A = bsxfun(@power,A,1:n);

%# reshape such that we get a r-by-n*c array
A = reshape(A,r,[])

A =

     1     1     2     4     9    81
     3     9     0     0     7    49
     3     9     1     1     4    16

答案 1 :(得分:1)

尝试以下操作(现在无法访问Matlab),它应该可以正常工作     

    A = [1 2 9; 3 0 7; 3 1 4];
    B = [];
    for i=1:n
         B = [B  A.^i];
    end
    B = [B(:,1:3:end)  B(:,2:3:end)  B(:,3:3:end)];
    

更节省内存的例程:     

    A = [1 2 9; 3 0 7; 3 1 4];
    B = zeros(3,3*n);
    for i=1:n
         B(3*(i-1)+1:3*(i-1)+3,:) = A.^i;
    end
    B = [B(:,1:3:end)  B(:,2:3:end)  B(:,3:3:end)];
    

答案 2 :(得分:0)

这是一个解决方案:

n = 4;
A = [1 2 9; 3 0 7; 3 1 4];
Soln = [repmat(A(:, 1), 1, n).^(repmat(1:n, 3, 1)), ...
        repmat(A(:, 2), 1, n).^(repmat(1:n, 3, 1)), ...
        repmat(A(:, 3), 1, n).^(repmat(1:n, 3, 1))];