让x=1:100
和N=1:10
。我想创建一个矩阵x^N
,以便i
第 th列包含条目[1 i i^2 ... i^N]
。
我可以使用 for 循环轻松做到这一点。但是有没有办法使用矢量化代码来做到这一点?
让x=1:100
和N=1:10
。我想创建一个矩阵x^N
,以便i
第 th列包含条目[1 i i^2 ... i^N]
。
我可以使用 for 循环轻松做到这一点。但是有没有办法使用矢量化代码来做到这一点?
我会去:
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]');
希望这可以帮助。
听起来像范德蒙德矩阵。所以使用范德:
A = vander(1:100);
A = A(1:10, :);
不确定它是否真的适合您的问题。
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))];
为什么不使用易于理解的 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
理解人们展示的这段代码的巧妙矢量化版本需要更多的思考。我的方式更像是一种野蛮的做事方式,但任何阅读它的人都会理解它。
我更喜欢易于理解的代码。
(是的,我可以预先分配。对于像这样的小案例,不值得降低清晰度。)