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

标签 c++ matrix linear-algebra eigen

这是我经常遇到的用例,例如当我想计算一个频谱图矩阵时。给定固定矩阵 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/

相关文章:

c++ - 避免矩阵复制构造函数

R - 混淆矩阵中缺失因子的条件替换

algorithm - 使用单源最短路径遍历棋盘

matlab - 根据输入在matlab中实现的异常行为算法

c++ - 使用默认参数的宏包装函数调用

c++ - 在 Direct3D 11 中绘制具有不同数量基元的对象

r - 如何识别不会增加 R 中矩阵秩的行/列?

python - 使用 scipy 稀疏矩阵求解方程组

c++ - 需要帮助理解 MFC 项目

c++ - 指向成员函数的指针的模板参数推导