允许x=1:100
和N=1:10
。我想创建一个矩阵x^N
,以便i
th 列包含条目[1 i i^2 ... i^N]
。
我可以使用for循环轻松完成此操作。但有没有办法使用矢量化代码?
答案 0 :(得分:11)
我会去:
x = 1:100;
N = 1:10;
Solution = repmat(x,[length(N)+1 1]).^repmat(([0 N])',[1 length(x)]);
另一种解决方案(可能效率更高):
Solution = [ones(size(x)); cumprod(repmat(x,[length(N) 1]),1)];
甚至:
Solution = bsxfun(@power,x,[0 N]');
希望这有帮助。
答案 1 :(得分:6)
听起来像范德蒙德矩阵。所以使用vander:
A = vander(1:100);
A = A(1:10, :);
答案 2 :(得分:5)
由于您的矩阵不是那么大,最直接的方法是使用MESHGRID和element-wise power operator .^
:
[x,N] = meshgrid(1:100,0:10);
x = x.^N;
这会创建一个11 x 100的矩阵,其中每列i
包含[i^0; i^1; i^2; ... i^10]
。
答案 3 :(得分:2)
不确定它是否真的适合您的问题。
bsxfun(@power, cumsum(ones(100,10),2), cumsum(ones(100,10),1))
修改强> 正如Adrien所指出的,我的第一次尝试不符合OP问题。
xn = 100;
N=10;
solution = [ones(1,xn); bsxfun(@power, cumsum(ones(N,xn),2), cumsum(ones(N,xn),1))];
答案 4 :(得分:1)
为什么不使用易于理解的for循环?
c = [1:10]'; %count to 100 for full scale problem
for i = 1:4; %loop to 10 for full scale problem
M(:,i) = c.^(i-1)
end
理解人们已经展示的这段代码的聪明矢量化版本需要更多的思考。我的做事更像是一种野蛮的做事方式,但阅读它的人都会明白这一点。
我更喜欢易于理解的代码。
(是的,我可以预先分配。对于像这样的小案例,不值得降低清晰度。)