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;
}
Здесь в перегрузке оператора * мне пришлось создать временную матрицу для хранения результата вычисления. Я думаю, что это добавляет значительные накладные расходы. Любые предложения, как обойти это?
Другой вариант — сделать аргументы перегрузки не константными, перезаписать одну из матриц и вернуть ее, но я думаю, что это очень рискованно в долгосрочной перспективе, я бы предпочел этого избежать.
Рассмотрим случай, когда я хочу что-то вроде этого:
матрица m = m1 * m2 * m3 * m4 * m5 * m6;
Здесь вы можете видеть, что я выделяю память для временного режима 6 раз в моей реализации. м должен быть выделен только один раз. Дальнейшее распределение просто накладные расходы.
Задача ещё не решена.