【问题标题】:How to run an iterative cross-correlation within a 3D array?如何在 3D 数组中运行迭代互相关?
【发布时间】:2018-10-10 10:15:59
【问题描述】:

我正在使用 Matlab 进行编码,但很想听听有关如何在其他语言中实现此功能的建议。

比如说我有一个 3D (m,n,t) 矩阵M。我想运行一个迭代 for 循环,它将循环遍历每个 i (1 : m) 和每个 j (1 : n),然后计算互相关t 表示循环中的当前 (i, j) 对,every 可能的 (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

【问题讨论】:

  • 那么,您有 2D 问题对吗?第三个维度是不必要的?
  • @AnderBiguri 我明白你的意思。我说 3D 是因为互相关关联了沿第三维的所有信息(在我的例子中是时间序列数据),但是为了这个问题,我猜它可以被认为是 2D。谢谢。
  • mm 不,那我没抓住重点。现在重新阅读我理解得更好。如果你想做这个“循环”,你需要嵌套 4 个 for 循环。 2 选择当前的i,j 和另一个 2 来遍历所有其他行/列而不是i,j

标签: python matlab for-loop multidimensional-array cross-correlation


【解决方案1】:

“以其他语言实现”是什么意思?什么语言?在matlab中我会先选择fft。

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

现在您可以乘以 ifft 来获得所有 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 秒。

【讨论】:

  • 太好了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2012-08-31
  • 1970-01-01
  • 2011-03-07
  • 2014-07-09
  • 2015-02-22
相关资源
最近更新 更多