###main.hpp
c++
1//main.cpp用のインクルードガード 2#ifndef STDIO_H 3#define STDIO_H 4#include <stdio.h> 5#endif 6 7#ifndef MATRIX_HPP 8#define MATRIX_HPP 9#include <matrix.hpp> 10#endif 11 12
main.cpp
c++
1#include <main.hpp> 2 3int main(){ 4 matrix::Matrix_2d<double,2,2> matrix_1;//2x2の行列オブジェクト作成 5 double var1[2][2] = {{1,2},{3,4}}; 6 matrix_1.copy(var1);//空の行列に数値を流し込む 7 8 matrix::Matrix_2d<double,2,3> matrix_2;//2x3の行列オブジェクト作成 9 double var2[2][3] = {{1,2,3},{4,5,6}}; 10 matrix_2.copy(var2);//空の行列に数値を流し込む 11 12 matrix::Matrix_2d<double,2,3> matrix_3;//2x3の行列オブジェクト作成 13 matrix_3.dot(matrix_1,matrix_2);//matrix_1 dot matrix_2 = matrix_3 14 matrix_3.print();//matrix_3の中身表示 15 16 return 0; 17}
###matrix.hpp(ヘッダー内に実装も記述)
c++
1#ifndef STDIO_H 2#define STDIO_H 3#include <stdio.h> 4#endif 5 6 7namespace matrix{ 8 template<typename TYPE,int COL,int ROW> 9 class Matrix_2d{//行列クラス 10 private: 11 int col = COL;//行数 12 int row = ROW;//列数 13 TYPE mat[COL][ROW];//行列の数値を保存するための配列 14 public: 15 void clear(){//ゼロクリア関数 16 for(int i=0;i<this->col;i++){ 17 for(int j=0;j<this->row;j++){ 18 (this->mat)[i][j] = 0; 19 } 20 } 21 } 22 void print(){//行列の中身表示用関数 23 printf("//////////////////////////////////////////////////////////////\n"); 24 for(int i=0;i<this->col;i++){ 25 printf("["); 26 for(int j=0;j<this->row;j++){ 27 printf("[%lf]",(this->mat)[i][j]); 28 } 29 printf("]\n"); 30 } 31 } 32 void copy(TYPE mat[COL][ROW]){//行列のコピー用関数 33 for(int i=0;i<this->col;i++){ 34 for(int j=0;j<this->row;j++){ 35 (this->mat)[i][j] = mat[i][j]; 36 } 37 } 38 } 39 void print_shape(){//行列の形状表示用関数 40 printf("shape = [%d,%d]\n",(this->col),(this->row)); 41 } 42 43 int get_col(){//行数表示用関数 44 return (this->col); 45 } 46 47 int get_row(){//列数表示用関数 48 return (this->row); 49 } 50 51 TYPE get_mat(int col_in,int row_in){//要素へのアクセス用関数 52 return (this->mat)[col_in][row_in]; 53 } 54 55 void dot(Matrix_2d in_1, Matrix_2d in_2) {//内積用関数 56 int i, j, k; 57 TYPE term; 58 59 for (i = 0; i < (this->col); i++) { 60 for (j = 0; j < (this->row); j++) { 61 term = 0; 62 for (k = 0; k < (in_2.get_col()); k++) { 63 term = term + in_1.get_mat(i,k) * in_2.get_mat(k,j); 64 } 65 (this->mat)[i][j] = term; 66 } 67 } 68 } 69 }; 70 71} 72 73 74 75
質問内容
c++初心者です。
上記のコードで2次元行列の内積を表現したいのですが
コンパイル時に下記のようなエラーが発生します。
おそらくmatrix_3.dot(matrix_1,matrix_2);
の引数のメモリサイズがそれぞれ違うのかな(トンチンカンなこと言ってたらごめんなさい)と思います
がエラーの回避方法がわからず困っています。
どうかご教授おねがいします。
error
1main.cpp:14:35: error: no matching function for call to ‘matrix::Matrix_2d<double, 2, 3>::dot(matrix::Matrix_2d<double, 2, 2>&, matrix::Matrix_2d<double, 2, 3>&)’ 2 matrix_3.dot(matrix_1,matrix_2); 3 ^ 4In file included from ./main.hpp:8:0, 5 from main.cpp:1: 6
エラーについては、メッセージ通りで、引数と戻り値が一致する関数が無いと言っています。
私の理解が不足しているのかも知れませんが、内積は行列を返すのでしょうか? 一つの数値を返すと理解していますが、、、。
質問を拝見して下さりありがとうございます。
dot関数は行列と行列の内積なので行列を返す関数です。
matrix_3 = matrix_1 dot matrix_2
matrix_3.dot(matrix_1,matrix_2)
↑ ↑ ↑
結果保存用 入力1 入力2
[2行3列] [2行2列] [2行3列]
回答2件
あなたの回答
tips
プレビュー