#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