0

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* 重载中,我必须创建一个临时矩阵来存储计算结果。我认为这增加了很大的开销。有什么建议可以解决这个问题吗?

另一种选择是将重载的参数设置为非 const,并覆盖其中一个矩阵并返回它,但我认为从长远来看这是非常冒险的,我宁愿避免它。

考虑我想要这样的情况:

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

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

4

0 回答 0