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.*X]
ans =
2 4 8
1 1 1
That works, but I can't face typing out the whole thing. Surely I don't have to write a for loop?
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):
- Using
cumprod
(this answer): 8.0762e-005 seconds
- Using
bsxfun
(answer by @thewaywewalk): 8.6170e-004 seconds
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.)
Use 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.