Matlab: реализация суммы экспонент с помощью дескрипторов функций - PullRequest
0 голосов
/ 01 июля 2018

Мне нужно реализовать следующую формулу с помощью дескрипторов функций в Matlab

enter image description here

где t - вектор времени, а n большое. Также Sk и fk постоянны для каждого k. Любой эффективный способ реализовать это приветствуется.

Edit:

Для первой гармоники я мог бы написать

y=@(t) s(1)*exp(i*2*pi*f(1)*t);

Однако я не могу использовать это в цикле for для генерации f (t). Есть ли векторный подход для этого?

1 Ответ

0 голосов
/ 01 июля 2018

Предполагая, что у вас есть вектор данных s, частотный вектор f одинаковой длины и вектор времени t (потенциально) различной длины, вы можете вычислить данное уравнение, используя

result = sum( s(:) .* exp( i*2*pi * f(:) .* t(:).' ), 1 );

То, что здесь происходит, s(:) заставляет s быть вектором столбца. Мы превращаем f в вектор-столбец таким же образом. t(:).' - это вектор строки. MATLAB выполняет неявное одноэлементное расширение, поэтому f(:) .* t(:).' возвращает 2D-матрицу. Другой .* также делает одноэлементное расширение для s. Наконец, sum(.,1) суммируется по первому измерению, которое превышает все значения f. Результатом является вектор строки той же длины, что и t.

Если вам нужен дескриптор функции, который вычисляет это, просто превратите однострочник в анонимную функцию:

y = @(t) sum( s(:) .* exp( i*2*pi * f(:) .* t(:).' ), 1 );

Эта анонимная функция будет захватывать s и f в том виде, в котором они существуют при его определении. t может быть поставлено позже:

result = y(t);

Но учтите, что ifft выполняет те же вычисления, но гораздо эффективнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...