4

假设我有一个包含 3 列的矩阵c1Ac2c3

1 2 9
3 0 7
3 1 4

我想要一个维度为 (3x3n) 的新矩阵,其中第一列是c1,第二列是c1^2,n 列是c1^n,n+1 列是c2,n+2 列是c2^2等等。在 MATLAB 中有没有一种快速的方法来做到这一点?

4

3 回答 3

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
于 2012-10-07T03:07:03.717 回答
1

尝试以下操作(现在无法访问 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)];
    

于 2012-10-07T03:04:50.197 回答
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))];
于 2012-10-07T03:01:56.283 回答