【问题标题】:How to generate the first twenty powers of x?如何生成 x 的前二十次方?
【发布时间】:2013-12-17 09:00:52
【问题描述】:

所以,我有 X,一个 300×1 的向量,我想要 [1, X, X*X, X*X*X, ... , X*X*...* X],一个 300×20 的矩阵。

我应该怎么做?

X=[2;1]
[X,X.*X,X.*X.*X]

ans =

   2   4   8
   1   1   1

这行得通,但我无法面对输入整个内容。确定不用写for循环吧?

【问题讨论】:

    标签: matlab octave vectorization


    【解决方案1】:

    使用bsxfun 获得简洁的解决方案,或者参加 Luis Mendo 的盛会以节省一些时间;)

    powers = 1:20;
    x = 1:20;
    
    result = bsxfun(@power,x(:),powers(:).');    
    

    给予:

     1    1    1 ...
     8   16   32 ...
    27   81  243 ...
    64  256 1024 ...
    ... ...  ...
    

    【讨论】:

      【解决方案2】:

      使用权力。它以 y 次方为基础,如果 y 是向量则重复。

      power(x,1:300)
      

      编辑:power 和 .^ 运算符是等价的。

      【讨论】:

      • 甚至x .^ (1:20)
      • 太棒了。谢谢你。既然你这么快,它不会让我接受答案。我会尽量记住以后再回来做!
      【解决方案3】:

      如果您想尽量减少操作次数

      cumprod(repmat(X(:),1,20),2) %// replace "20" by the maximum exponent you want
      

      基准测试:对于大小为 300x1 的 X,最大指数为 20。我用 tictoc 测量时间,平均 1000 次。结果(平均值):

      • 使用cumprod(这个答案):8.0762e-005 秒
      • 使用bsxfun(@thewaywewalk 回答):8.6170e-004 秒

      【讨论】:

      • 我只是在输入同样的解决方案 - 要走的路!
      • @Shai 谢谢!重复使用以前的结果总是很重要 :-)
      • 像 bsxfun 解决方案一样,你应该提到X 需要是一个列向量,
      • @thewaywewalk 谢谢。已更正
      【解决方案4】:

      element-wise power operator .^ 应该可以满足您的需求:

      x .^ (1:20)
      

      (假设x 是一个列向量。)

      【讨论】:

      • @LuisMendo:你的意思是它不适用于行向量?
      • 对于 OP 中的示例:[2;1].^(1:20):错误,尺寸不匹配
      • @LuisMendo:这对我来说在 Octave 中效果很好(目前手头没有 Matlab)。也许 Octave 改进了一些东西?
      • 哦,一定是这个原因。我正在使用 Matlab (2010b)
      猜你喜欢
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      相关资源
      最近更新 更多