我想创建以下形式的矩阵
Y = [1 x x.^2 x.^3 x.^4 x.^5 ... x.^100]
设x是列向量。 甚至更多的变种,如
Y = [1 x1 x2 x3 (x1).^2 (x2).^2 (x3).^2 (x1.x2) (x2.x3) (x3.x1)]
令x1,x2和x3为列向量 让我们考虑第一个。我尝试过像
这样的东西 Y = [1 : x : x.^100]
但这也行不通,因为它意味着取Y = [1 x 2. * x 3. * x ... x。^ 100]? (即所有值在1到x。^ 100之间,差异为x) 所以,这也不能用于生成这样的矩阵。 请考虑x = [1; 2; 3; 4]; 并建议一种生成此矩阵的方法
Y = [1 1 1 1 1;
1 2 4 8 16;
1 3 9 27 81;
1 4 16 64 256];
无需手动编写
Y = [ones(size(x,1)) x x.^2 x.^3 x.^4]
答案 0 :(得分:5)
使用此bsxfun
技术 -
N = 5; %// Number of columns needed in output
x = [1; 2; 3; 4]; %// or [1:4]'
Y = bsxfun(@power,x,[0:N-1])
输出 -
Y =
1 1 1 1 1
1 2 4 8 16
1 3 9 27 81
1 4 16 64 256
如果你有x = [1 2; 3 4; 5 6]
,而你希望Y = [1 1 1 2 4; 1 3 9 4 16; 1 5 25 6 36]
,Y = [ 1 x1 x1.^2 x2 x2.^2 ]
用于列向量x1
,x2
...,则可以使用此单行 -
[ones(size(x,1),1) reshape(bsxfun(@power,permute(x,[1 3 2]),1:2),size(x,1),[])]
答案 1 :(得分:2)
使用Matlabs vander()中的代码的改编版本 - 函数(也可以在polyfit函数中找到)与Divakars漂亮和简短的解决方案相比,如果你使用这样的东西,可以获得显着的加速:
N = 5;
x = [1:4]';
V(:,n+1) = ones(length(x),1);
for j = n:-1:1
V(:,j) = x.*V(:,j+1);
end
V = V(:,end:-1:1);
对于给出的示例,它大约快两倍,如果我设置N=50
和x = [1:40]'
,它的速度大约是后者的20倍。虽然我说要比较时间并不容易,但如果速度是一个问题,那么你可以看看这个解决方案。
答案 2 :(得分:1)
在八度音阶中,广播允许写
N=5;
x = [1; 2; 3; 4];
y = x.^(0:N-1)
输出 -
y =
1 1 1 1 1
1 2 4 8 16
1 3 9 27 81
1 4 16 64 256