Ublas Matrix元素产品的高效实现

时间:2014-07-01 08:10:28

标签: c++ c++11 multidimensional-array move-semantics boost-ublas

makemake我对Boost Ublas Matrix的元素产品的默认函数进行了基准测试,发现element_prod比我用简单的for循环编写自己的实现要慢。所以,我决定写自己的版本。

我正在尝试使用如下语句的元素矩阵乘法来实现元素矩阵乘法的代码:

matrix m1, m2, m3;
m3 = m1 * m2;

在这里,我想利用C ++ 11移动语义来有效地返回乘法的输出。

这是我到目前为止所做的。

#include "boost\numeric\ublas\matrix.hpp"
#include <Windows.h>
typedef boost::numeric::ublas::matrix<float> matrix;
void ElemProd();
const size_t X_SIZE = 400;
const size_t Y_SIZE = 400;
const size_t ITERATIONS = 500;
matrix operator*(const matrix &m1, const matrix &m2)
{
    size_t rows = m1.size1();
    size_t cols = m2.size2();
    matrix temp(rows,cols);
    for (size_t i = 0; i < rows; i++)
    {
        for (size_t j = 0; j < cols; j++)
        {
            temp(i, j) = m1(i, j) * m2(i, j);
        }
    }

    //return std::move(temp);
    return temp;
 }

void ElemProd()
{
     matrix m1(X_SIZE, Y_SIZE);
     matrix m2(X_SIZE, Y_SIZE);
     for (size_t i = 0; i < X_SIZE; i++)
     {
         for (size_t j = 0; j < Y_SIZE; j++)
         {
             m1(i, j) = 2;
             m2(i, j) = 10;
         }
     }

         matrix m3 = m1; // simply to allocate the right amount of memory for m3, to be overwritten.
         m3 = m1 * m2;
   }

这里,在operator * overload中,我不得不创建一个临时矩阵来存储计算结果。我认为这会增加很大的开销。有什么建议如何解决这个问题?

另一个选择是使重载的参数不是const,并覆盖其中一个矩阵并返回它,但我认为这是非常冒险的长期,我宁愿避免它。

考虑我想要这样的事情:

  

矩阵m = m1 * m2 * m3 * m4 * m5 * m6;

在这里,你可以看到我在我的实现中为temp分配内存6次。 m应该只需要分配一次。进一步的分配只是开销。

0 个答案:

没有答案