So, I\'ve got X, a 300-by-1 vector and I\'d like [1, X, X*X, X*X*X, ... , X*X*...*X], a 300-by-twenty matrix.
How should I do this?
X=[2;1]
[X,X.*X,X.*X
Use bsxfun
for a neat solution, or go for Luis Mendo's extravaganza to save some time ;)
powers = 1:20;
x = 1:20;
result = bsxfun(@power,x(:),powers(:).');
gives:
1 1 1 ...
8 16 32 ...
27 81 243 ...
64 256 1024 ...
... ... ...
The element-wise power operator .^
should do what you need:
x .^ (1:20)
(assuming x
is a column vector.)
If you want to minimize the number of operations:
cumprod(repmat(X(:),1,20),2) %// replace "20" by the maximum exponent you want
Benchmarking: for X
of size 300x1, maximum exponent 20. I measure time with tic
, toc
, averaging 1000 times. Results (averages):
cumprod
(this answer): 8.0762e-005 secondsbsxfun
(answer by @thewaywewalk): 8.6170e-004 secondsUse power. It raises something to the power of y, and repeats if y is a vector.
power(x,1:300)
edit: power and .^ operator are equivalent.