C++ 在滚动窗口上应用矩阵乘法的最聪明方法

C++ 在滚动窗口上应用矩阵乘法的最聪明方法,c++,matrix,linear-algebra,eigen,C++,Matrix,Linear Algebra,Eigen,这是我经常遇到的一个用例,例如,当我想要计算谱图矩阵时。给定固定矩阵M FFT矩阵和向量v音频信号,计算矩阵N,使得N的每列i是M*v.segmenti*窗口跳、i*窗口跳+窗口大小的乘积 这可以很容易地实现,因为N的大小是已知的,通过预分配然后遍历列 我觉得可以做一些更聪明的事情,即构建一个矩阵V,其中V的每一列I都是V.segmenti*window\u hop,I*window\u hop+window\u size。然后N=M*V,不需要for循环,所有东西都可以平滑地并行化。如果需要,

这是我经常遇到的一个用例,例如,当我想要计算谱图矩阵时。给定固定矩阵M FFT矩阵和向量v音频信号,计算矩阵N,使得N的每列i是M*v.segmenti*窗口跳、i*窗口跳+窗口大小的乘积

这可以很容易地实现,因为N的大小是已知的,通过预分配然后遍历列

我觉得可以做一些更聪明的事情,即构建一个矩阵V,其中V的每一列I都是V.segmenti*window\u hop,I*window\u hop+window\u size。然后N=M*V,不需要for循环,所有东西都可以平滑地并行化。如果需要,可以将V切成块

这种方法的底线是V的构造。有没有一种构造V的方法既快速又节省内存?因为如果window\u hop 是否有更好的方法来执行此计算?

为一维FFT提供了一个API,使用kissfft或FFTW库来有效地处理您的输入


除了FFT的情况,在我看来,您正在寻找的是一种使用特征矩阵实现卷积的有效方法。一段时间前,Eigen论坛上发布了一个2D案例的示例。

听起来像是一个问题,但从编程的角度来看,似乎可以修改一些东西,使矩阵的水平步长等于其自身的垂直步长。不过,它很可能会破坏现有的优化代码。看起来某些部分产品可以在不同的窗口之间重复使用,因为许多值是相同的,它们会发生一些可预测的增量变化。也就是说,当你做重叠的FFT时,如果我们同意将几个矩阵/向量乘法压缩成一个矩阵/矩阵乘法的解决方案,那么创建v段叠加的最有效方法是什么?使用for循环?请注意,此问题与要执行FFT/other的计算类型无关。考虑到这一点,卷积解决方案将是高效的iff window_hop=1,这意味着一个N轴的大小应该与音频具有相同的长度。事实并非如此,窗口跳数约为350。使用卷积运算需要每350列选择1列,从而使大部分计算效率低下。