다음 코드는 테스트되지 않은, 그러나 그것은 당신에게 행렬 곱셈을 수행하는 방법에 대한 아이디어를 제공해야합니다.
operator*
을 멤버 함수가 아닌 자유 함수로 정의하는 것이 좋습니다.
template<typename T>
class Matrix
{
public:
Matrix(int r, int c)
: rows(r)
, cols(c)
, elements.resize(rows * cols)
{ }
int rows = 0, cols = 0;
T& operator()(int i, int j) { return elements[i * ncols + j]; }
std::vector<T> elements;
};
template<typename T>
Matrix<T> operator*(Matrix<T> const& a, Matrix<T> const& b)
{
assert(a.cols == b.rows);
Matrix<T> c(a.rows, b.cols);
for (int output_row = 0; output_row < a.rows; ++output_row)
{
for (int output_col = 0; output_col < b.cols; ++output_col)
{
double sum = 0.0;
for (int i = 0; i < a.cols; ++i)
sum += a(output_row, i) * b(i, output_col);
c(output_row, output_col) = sum;
}
}
return c;
}
아마도 M과 N을 해당 유형으로 인코딩합니다. 그렇지 않으면 행렬이 호환되는지 런타임에 확인해야합니다. (또는 당신은 numpy가 파이썬에서 무엇을 하는지를 "방송"으로 취급 할 수 있습니다.) – AndyG
좋습니다. 그리고 어디에서 일하는 것이 멈 춥니 까? 실제로 [행렬 곱셈] (https://en.wikipedia.org/wiki/Matrix_multiplication)하는 방법을 찾았습니까? – scohe001
[연산자 과부하가있는 행렬 곱셈]의 가능한 복제본 (https://stackoverflow.com/questions/9347337/matrix-multiplication-with-operator-overloading) – yuxiang