Скажем, мне даны вектор-строка 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
является вектором, но сборка правильной матрицы кажется мне почти столь же дорогостоящей.
Я ценю любую помощь.
Спасибо большое, посмотрю!
Поскольку на вопрос уже дан ответ, имеет ли смысл включать такой пример?
@HyperbolicPDEfriend Минимальный воспроизводимый пример всегда хорошая идея. Так будущим посетителям будет легче понять, совпадает ли их вопрос с вашим.
Это взаимная корреляция. Вы можете использовать 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
Очень элегантно, спасибо!
Я попробовал, работает как шарм!
Также conv(qp, flip(psi), 'valid')
работает
Вы могли бы записать это как поточечное умножение/сумма матрица-матрица, но в некоторых столбцах вам нужно будет иметь нули. Можете ли вы изменить свой вопрос, указав значения
M,P,q,psi
, чтобы ваш пример был Минимальным, воспроизводимым примером