令 x=1:100
,N=1:10
。我想要创建一个矩阵 x^N
,使得第 i
列包含条目 [1 i i^2 ... i^N]
。
我可以使用 for 循环轻松完成这个任务。但是是否有一种使用向量化代码的方法呢?
令 x=1:100
,N=1:10
。我想要创建一个矩阵 x^N
,使得第 i
列包含条目 [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]');
希望这可以帮到你。clear all; V=ones(10000); V=V.';
会给我一个内存不足的错误。此外,将数字提高到如此大的幂几乎没有任何意义。即使只是2^1000
,结果也是1.0715e+301
,接近双精度浮点数的最大值。 - gnovice不确定它是否真正符合您的问题。
bsxfun(@power, cumsum(ones(100,10),2), cumsum(ones(100,10),1))
编辑: 正如Adrien所指出的那样,我的第一次尝试并不符合问题要求。
xn = 100;
N=10;
solution = [ones(1,xn); bsxfun(@power, cumsum(ones(N,xn),2), cumsum(ones(N,xn),1))];
1:100
。 - Adrien为什么不使用易于理解的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
要理解人们展示的聪明向量化版本的这段代码,需要更多的思考。我的方法比较野蛮,但是任何人读它都能理解。
我喜欢易于理解的代码。
(是的,我可以预先分配内存。但对于这种小型情况降低清晰度不值得。)
.^
运算符。相反,用1填充第一行,然后通过将前一行乘以[1:100]
来创建每个新行。这样既具有可读性又具有效率。 - Adrien