Векторизуйте «сжимающееся» скалярное произведение в MATLAB

Скажем, мне даны вектор-строка psi длины P и вектор-строка q длины M в MATLAB. Вот, M>P. Я хочу собрать G следующим образом:

for j = 1:M
        G(j) = q(j:min(j+P-1, M))*psi(1:min(M-j+1, P))';
end

Для больших M, P это отнимает очень много времени. Он также деликатный до размера q и psi меняется на большой j.

Например: (адаптировано к ответу) Если

M = 20;
P = 7;
psi = [1:P];
q = [1:M];

, затем

G =

  Columns 1 through 11

   140   168   196   224   252   280   308   336   364   392   420

  Columns 12 through 20

   448   476   504   385   280   190   116    59    20

если он создан с помощью вышеуказанного цикла for.

Мне не удалось векторизовать это, в том числе из-за перемещения j. Конечно, можно было бы записать это как умножение матрицы на вектор, где psi является вектором, но сборка правильной матрицы кажется мне почти столь же дорогостоящей.

Я ценю любую помощь.

Вы могли бы записать это как поточечное умножение/сумма матрица-матрица, но в некоторых столбцах вам нужно будет иметь нули. Можете ли вы изменить свой вопрос, указав значения M,P,q,psi, чтобы ваш пример был Минимальным, воспроизводимым примером

BillBokeey 01.07.2024 16:49

Спасибо большое, посмотрю!

Hyperbolic PDE friend 01.07.2024 18:31

Поскольку на вопрос уже дан ответ, имеет ли смысл включать такой пример?

Hyperbolic PDE friend 01.07.2024 18:34

@HyperbolicPDEfriend Минимальный воспроизводимый пример всегда хорошая идея. Так будущим посетителям будет легче понять, совпадает ли их вопрос с вашим.

beaker 01.07.2024 19:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это взаимная корреляция. Вы можете использовать xcorr , а затем обрезать результаты или заполнить и позволить filter2 сделать всю работу за вас. Я решил использовать filter2.

Поскольку вам нужны только допустимые значения в начале и все значения в конце, вам нужно дополнить конец q нулями P - 1.

M = 20;
P = 7;
q = [1:M];
psi = [1:P];
qp = [q zeros(1, P-1)];   % padded q

G_filt = filter2(psi, qp, 'valid');

G_filt =
 Columns 1 through 16:
   140   168   196   224   252   280   308   336   364   392   420   448   476   504   385   280
 Columns 17 through 20:
   190   116    59    20

Результаты вашего примера:

G =
 Columns 1 through 16:
   140   168   196   224   252   280   308   336   364   392   420   448   476   504   385   280
 Columns 17 through 20:
   190   116    59    20

Очень элегантно, спасибо!

Hyperbolic PDE friend 01.07.2024 18:31

Я попробовал, работает как шарм!

Hyperbolic PDE friend 01.07.2024 18:36

Также conv(qp, flip(psi), 'valid') работает

Luis Mendo 01.07.2024 19:54

Другие вопросы по теме

Я получаю невероятную ошибку в цикле for на языке C. Цикл for работает в 1,2 и 3, но внезапно останавливается
Тип «строка» не может использоваться для индексации типа «Объект» с помощью цикла for
Как я могу использовать два цикла for вместе (по одному на каждый год и по одному на каждый день)?
VBA находит 2-е, 3-е и 4-е вхождения, если в цикле FOR NEXT выполнено несколько условий IF
Как я могу пройти все возможные числа в одном цикле?
Почему переменная передает «текст объекта» вместо значений?
Для цикла ggplot не работает - строится тот же график
Перебор двух столбцов и всех строк в R и формирование двух новых столбцов на основе их значений
Может ли кто-нибудь объяснить, почему добавление списка с помощью метода list в цикле for предотвращает добавление только последнего элемента?
Как перебирать словарь, чтобы получить значения на самом низком уровне?