How to generate the first twenty powers of x?

2019-03-05 02:41发布

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?

4条回答
放荡不羁爱自由
2楼-- · 2019-03-05 03:19

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 ...
... ...  ...
查看更多
forever°为你锁心
3楼-- · 2019-03-05 03:20

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
查看更多
放我归山
4楼-- · 2019-03-05 03:23

The element-wise power operator .^ should do what you need:

x .^ (1:20)

(assuming x is a column vector.)

查看更多
手持菜刀,她持情操
5楼-- · 2019-03-05 03:27

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.

查看更多
登录 后发表回答