8

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

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;
}

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

4

5 回答 5

7

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;
}
于 2011-05-19T16:51:42.240 回答
4

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

于 2011-05-19T16:42:27.753 回答
2

考虑GNU Scientific LibraryMV++

如果你对 C 没意见,那么BLAS是一个低级库,它包含 C 和 C 包装的 FORTRAN 指令,并用于大量高级数学库。

我对此一无所知,但另一个选择可能是Meschach,它似乎有不错的表现

编辑:关于您关于不想使用使用您的显卡的库的评论,我会指出,在许多情况下,使用您的显卡的库是标准(非 GPU)库的专门实现。例如,BLAS 的各种实现在它的 Wikipedia 页面上列出,只有一些是为利用您的 GPU 而设计的。

于 2011-05-19T16:42:57.003 回答
1

有一本书叫Introduction to Algorithms。您可能想查看动态编程的章节。它具有使用动态编程的出色矩阵乘法算法。它值得一读。好吧,这个信息是为了以防你想编写自己的逻辑而不是使用库。

于 2011-05-19T16:46:15.190 回答
0

有很多有效的矩阵乘法算法。

高效矩阵乘法算法

查看算法,找到实现。

你也可以为它做一个多线程的实现。

于 2011-05-19T16:47:35.440 回答