如何优化矩阵乘法运算

geo*_*rge 7 c++ matrix matrix-multiplication

我需要在我的应用程序中执行大量的矩阵运算.最耗时的是矩阵乘法.我这样实现了它

template<typename T>
Matrix<T> Matrix<T>::operator * (Matrix& matrix)
{


    Matrix<T> multipliedMatrix = Matrix<T>(this->rows,matrix.GetColumns(),0);

    for (int i=0;i<this->rows;i++)
    {
        for (int j=0;j<matrix.GetColumns();j++)
        {
            multipliedMatrix.datavector.at(i).at(j) = 0;
            for (int k=0;k<this->columns ;k++)
            {
                multipliedMatrix.datavector.at(i).at(j) +=  datavector.at(i).at(k) * matrix.datavector.at(k).at(j);
            }
            //cout<<(*multipliedMatrix)[i][j]<<endl;
        }
    }
    return multipliedMatrix;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法以更好的方式写它?到目前为止,矩阵乘法运算占用了我的应用程序的大部分时间.也许是有好/快的库来做这种事情?但是我宁愿不能使用使用图形卡进行数学运算的库,因为我在带有集成显卡的笔记本电脑上工作.

Arl*_*len 6

到目前为止,Eigen是迄今为止速度最快的线性代数库之一.它写得很好,而且质量很高.此外,它使用表达式模板,使编写更易读的代码.刚刚发布的第3版使用OpenMP进行数据并行.

#include <iostream>
#include <Eigen/Dense>

using Eigen::MatrixXd;

int main()
{
  MatrixXd m(2,2);
  m(0,0) = 3;
  m(1,0) = 2.5;
  m(0,1) = -1;
  m(1,1) = m(1,0) + m(0,1);
  std::cout << m << std::endl;
}
Run Code Online (Sandbox Code Playgroud)


Cli*_*ton 4

我认为Boost uBLAS绝对是处理这类事情的方法。Boost 设计精良、经过充分测试并在许多应用中使用。

  • 与其他可用选项(Eigen、CUBLAS、MKL)相比,Boost uBLAS 的性能相当糟糕。Eigen 特别集成了 Boost uBLAS 使用的许多概念,并且可以为各种 CPU 架构发出 SIMD 指令。 (3认同)