这是我经常遇到的用例,例如当我想计算一个频谱图矩阵时。给定固定矩阵 M(FFT 矩阵)和 vector v(音频信号),计算矩阵 N,使得 N 的每一列 i 为 M * v.segment(i * window_hop, i * window_hop + window_size).
这可以很容易地实现,因为 N 的大小是已知的,通过预分配然后遍历列。
我觉得可以做一些更聪明的事情,即构造一个矩阵 V,其中 V 的每一列 i 是 v.segment(i * window_hop, i * window_hop + window_size)。然后 N = M * V,不需要 for 循环,一切都可以顺利并行化(如果需要,您可以将 v 切成 block )。
这种方法的底线是V的构造。有没有一种方法可以构造既快速又节省内存的V? (因为如果 window_hop < window_size V 有很多重复)
是否有更好的方法来执行此计算?
最佳答案
EigenFFT package使用 kissfft 或 FFTW 库为一维 FFT 提供 API,以高效处理您的输入。
超越 FFT 的情况,在我看来,您正在寻找的是一种使用特征矩阵实现卷积的有效方法。 nice solution不久前在 Eigen 论坛上发布了 2D 案例。
关于c++ - 在滚动窗口上应用矩阵乘法的最聪明方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24047666/