Как запустить итеративную взаимную корреляцию в трехмерном массиве? - PullRequest
0 голосов
/ 30 апреля 2018

Я кодирую в Matlab, но было бы интересно услышать предложения о том, как это можно реализовать на других языках.

Скажем, например, у меня есть 3D (m, n, t) матрица M . Я хочу запустить итеративный цикл for, который будет циклически проходить через каждый i (1: m) и каждый j (1: n), а затем вычислять взаимную корреляцию по t для текущей ( i , j ) пары в цикле, с каждые возможными ( i , j ) комбинация в матрице. Следовательно, каждый ( i , j ) имеет в общей сложности n * m связанных корреляций.

Я выписал это как псевдокод ниже, но не могу придумать, как правильно его реализовать. К сожалению, в Matlab функция «corrcoef» не позволяет перебирать 1: m, 1: n внутри самой функции.

Любая помощь будет отличной!

M = randn(m,n,t);
Xcor_vals = zeros(m,n,m*n);
for i = 1:m 
    for j = 1:n
        R = Xcor(M(i,j,:),M(1:m,1:n,:)); 
        Xcor_vals(i,j,:) = R;
    end
end

1 Ответ

0 голосов
/ 30 апреля 2018

Как вы понимаете "реализовано на других языках"? Какой язык? В Matlab я бы сначала пошел на FFT.

m=40;n=30;t=100;
M = randn(m,n,t);
Mf = fft(M,[],3);

Теперь вы можете умножать и делать, чтобы получить взаимную корреляцию для всех m и n с точками i и j.

tic
Xcorr_vals = nan(m,n,m,n,t);
for i = 1:m
    for j = 1:n
        Xcorr_vals(i,j,:,:,:) = ifft(conj(Mf(i,j,:)).*Mf,[],3);
    end
end
toc

Прошедшее время составляет 4,24 секунды.

...