/* 問題文
(1)行列の乗算を行う関数
(2)行列の(i,j)要素に値をセットする関数
(3)行列の(i,j)要素の値を得る関数
(4)行列の第p行と第q行を入れ替える関数 を作りなさい。*/
#include<stdio.h>
#define M 2
#define N 2
#define MN_MAX 100
//行列データのための構造体を宣言
struct matrix_data{
int row;
int col;
double dat[MN_MAX];
};
//指定されたサイズの行列データを用意する
struct matrix_data init_matrix(int m, int n)
{
struct matrix_data mat;
mat.row = m ;
mat.col = n;
return mat;
}
//行列の(i,j)要素に値をセットする
struct matrix_data set_matrix(struct matrix_data mat, int i, int j, double val)
{
mat.dat[i*mat.col + j] = val;
return mat;
}
//行列の(i,j)要素の値を得る
double get_matrix(struct matrix_data mat, int i, int j)
{
return mat.dat[i*mat.col + j];
}
//行列aと行列bの積を計算し、結果を行列cに格納する
struct matrix_data multi_matrix(struct matrix_data a, struct matrix_data b)
{
int i, j, k;
int m, n;
struct matrix_data c;
m = a.row;
n = a.col;
c = init_matrix(m,n);
for(i = 0; i < m; i ++){
for(j = 0; j < n; j++){
for(k = 0; k < n/2; k++){
c = set_matrix(c,i,j,get_matrix(a,i,k)*get_matrix(b, k, j)+get_matrix(a,i,k+1)*get_matrix(b, k+1, j)); //汎用的でない気がします。。。
}
}
}
return c;
}
//行列データを画面に表示する
void show_matrix(struct matrix_data mat)
{
int i, j;
for(i = 0; i < mat.row; i++){
for(j = 0; j < mat.col; j++){
printf("%f ",get_matrix(mat, i, j));
}
printf("\n");
}
}
//行列の第p行と第q行を入れ替える
struct matrix_data change_matrix(struct matrix_data c)
{
int i, j;
int m,n;
struct matrix_data c;
m = c.row;
n = c.col;
c = init_matrix(m,n);
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
// ここがわかりません。。。
}
}
return c;
}
int main(void)
{
struct matrix_data a, b, c;
a = init_matrix(M,N);
b = init_matrix(M,N);
c = init_matrix(M,N);
a = set_matrix(a, 0, 0, 1.0);
a = set_matrix(a, 0, 1, 2.0);
a = set_matrix(a, 1, 0, 3.0);
a = set_matrix(a, 1, 1, 4.0);
b = set_matrix(b, 0, 0, 5.0);
b = set_matrix(b, 0, 1, 6.0);
b = set_matrix(b, 1, 0, 7.0);
b = set_matrix(b, 1, 1, 8.0);
c = set_matrix(c, 0, 0, 0.0);
c = set_matrix(c, 0, 1, 0.0);
c = set_matrix(c, 1, 0, 0.0);
c = set_matrix(c, 1, 1, 0.0);
c = multi_matrix(a,b);
show_matrix(c);
c = change_matrix(c);
show_matrix(c);
return 0;
}