2017-11-09 16 views
-1

다른 유형의 요소가있는 m, n 행렬을 선언하는 클래스를 만들었습니다.가변 크기의 곱셈 행렬

두 행렬을 곱하기 위해 연산자에 과부하가 걸리는 이유는 무엇입니까? 저는 다양한 크기를 가질 수있는 행렬을 다루는 것에 대해 혼란 스럽습니다.

은 내가이 줄을해야 함을 알고 있지만 난 후에 할 것을 확실하지 않다 :

Matrix<T> operator*(Matrix<T> const &b) 
+1

아마도 M과 N을 해당 유형으로 인코딩합니다. 그렇지 않으면 행렬이 호환되는지 런타임에 확인해야합니다. (또는 당신은 numpy가 파이썬에서 무엇을 하는지를 "방송"으로 취급 할 수 있습니다.) – AndyG

+1

좋습니다. 그리고 어디에서 일하는 것이 멈 춥니 까? 실제로 [행렬 곱셈] (https://en.wikipedia.org/wiki/Matrix_multiplication)하는 방법을 찾았습니까? – scohe001

+1

[연산자 과부하가있는 행렬 곱셈]의 가능한 복제본 (https://stackoverflow.com/questions/9347337/matrix-multiplication-with-operator-overloading) – yuxiang

답변

0

다음 코드는 테스트되지 않은, 그러나 그것은 당신에게 행렬 곱셈을 수행하는 방법에 대한 아이디어를 제공해야합니다.

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