说我有3列c1
,c2
和c3
一个矩阵A。扩大与多项式a矩阵
1 2 9
3 0 7
3 1 4
我希望尺寸(3x3n),其中第一列是c1
,第2栏是c1^2
,所述n列是c1^n
,第n + 1列是c2
,第n + 2的一个新的矩阵列是c2^2
等。有没有一种快速的方法在MATLAB中做到这一点?
说我有3列c1
,c2
和c3
一个矩阵A。扩大与多项式a矩阵
1 2 9
3 0 7
3 1 4
我希望尺寸(3x3n),其中第一列是c1
,第2栏是c1^2
,所述n列是c1^n
,第n + 1列是c2
,第n + 2的一个新的矩阵列是c2^2
等。有没有一种快速的方法在MATLAB中做到这一点?
结合PERMUTE,BSXFUN和RESHAPE,你可以很容易地做到这一点,它可以适用于任何尺寸的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
这里是一个解决方案:
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))];
试试下面的(没有马上进入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)];
'B'正在循环中增长,对于'n'来说效率非常低。 –
通过定义B =零(3,3 * n)并将循环内部的行更改为B(3 *(i-1)+1:3 *(i-1)+3,:),可以避免低效率= A.^i; – Cyrgo
同意。但是,根据经验水平,OP可能没有意识到这一点,所以如果你在答案中明确表示它,那将是最好的。 –
我只是在一个普通的'bsxfun'解决方案,当你发布这个:-)我会留下我的答案,因为它比我想出的更优雅。 +1。 –
它完美无缺地工作。感谢您的帮助。 – FabianG