【问题标题】:Expand a matrix with polynomials用多项式展开矩阵
【发布时间】:2012-10-09 00:59:16
【问题描述】:

假设我有一个包含 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 中有没有快速的方法来做到这一点?

【问题讨论】:

    标签: matlab matrix polynomial-math


    【解决方案1】:

    结合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
    

    【讨论】:

    • 当您发布此内容时,我正在研究一个通用的bsxfun 解决方案 :-) 我会保留我的答案,因为这比我想出的更优雅。 +1。
    【解决方案2】:

    尝试以下(目前无法访问 Matlab),它应该可以工作

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

    更节省内存的例程:

    A = [1 2 9; 3 0 7; 3 1 4]; B = 零(3,3*n); 对于 i=1:n B(3*(i-1)+1:3*(i-1)+3,:) = A.^i; 结尾 B = [B(:,1:3:end) B(:,2:3:end) B(:,3:3:end)];

    【讨论】:

    • B 在循环内增长,对于大的n 来说效率非常低。
    • 可以通过定义 B = zeros(3,3*n) 并将循环内的行更改为 B(3*(i-1)+1:3*(i- 1)+3,:) = A.^i;
    • 同意。但根据经验水平,OP 可能不会意识到这一点,因此最好在答案中明确说明。
    【解决方案3】:

    这是一种解决方案:

    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))];
    

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      相关资源
      最近更新 更多