Общий способ генерации конечных геометрических рядов в MATLAB

#matlab #series

#matlab #Серии

Вопрос:

Предположим, у меня есть некоторое число a , и я хочу получить вектор [ 1 , a , a^2 , ... , a^N ] . Я использую [ 1 , cumprod( a * ones( 1 , N - 1 ) ) ] код. Каков наилучший (и, вероятно, эффективный) способ сделать это?

Ответ №1:

Как насчет a.^[0:N] ?

Комментарии:

1. Я боюсь, что для этого потребуется O (N ^ 2) продуктов, в то время как cumprod требуется только O (N) продуктов

2. Определенно, самый компактный способ

3. @UncleAli: Попробуйте профилировать оба метода. Но да, это обязательно будет медленнее.

4. @Jacob: Мой способ составляет ок. в 2 раза быстрее. Тем не менее, это приемлемо из-за значительного улучшения читаемости. Спасибо.

5. @UncleAli: Следует отметить пару моментов… 1) Я бы не ожидал, a.^(0:N) что зависимость от O (N ^ 2), вероятно, больше похожа на O (N logN), поскольку я полагаю, что возведение в степень выполняется с помощью более эффективного алгоритма . 2) Не будьте слишком застигнуты врасплох, если результаты двух разных методов не будут * точно равны при использовании значений с плавающей запятой для a . Поскольку они используют два разных базовых алгоритма с разными порядками математических операций, вы можете увидеть крошечные различия в порядке точности с плавающей запятой.

Ответ №2:

Ответ Тибтиба абсолютно правильный, но он не очень легко обобщается, если a происходит с вектором. Итак, в качестве отправной точки:

 > a= 2
a =  2
> n= 3
n =  3
> a.^[0: n]
ans =
   1   2   4   8
  

Теперь вы также можете использовать встроенную функцию vander (хотя порядок отличается, но это легко исправить при необходимости), чтобы произвести:

 > vander(a, n  1)
ans =
   8   4   2   1
  

И с векторным значением a :

 > a= [2; 3; 4];
> vander(a, n  1)
ans =
   8    4    2    1
  27    9    3    1
  64   16    4    1