C言語関係掲示板

過去ログ

No789 N*Mの行列演算

[戻る] [ホームページ]
No.9814

わからなくて困っています
投稿者---H(2003/10/16 01:28:38)


学校の課題なんですが、ファイルの入出力を行うプログラムと、N*Mの行列演算を行うプログラムを作成せよという課題がでました。

#include <stdio.h>
 #include <math.h>

 #define M 3
 #define N 3

 void inputdata(FILE *fdata, double x[][N],int m, int n);
 void matsum(double x[][N], double y[][N], double z[][N], int m, int n);
 void matprod(double x[][M], double y[][N], double z[][N], int m, int k, int n);
 
 void out_res(FILE *fout, double a[][N], int m, int n);

 int main(void) {

   double a[3][N], b[3][N], c[2][N];
   double sum1[3][N], prod1[3][N];
   FILE   *fdata, *fout;

   fdata = fopen("matrix.txt","r");
   fout  = fopen("output.txt","w");

   inputdata(fdata, a, 3, 2);
   inputdata(fdata, b, 3, 2);
   inputdata(fdata, c, 2, 3);

   matsum(a, b, sum1, 3, 2);
   matprod(a, c, prod1, 3, 2, 3);
   

   printf("A+B =\n");
   fprintf(fout, "A+B =\n");
   out_res(fout, sum1, 3, 2);
   printf("\nA*c =\n");
   fprintf(fout, "\nA*c =\n");
   out_res(fout, prod1, 3, 3);
  
   fclose(fdata);
   fclose(fout);

   return 0;
 }

 void inputdata(FILE *fdata, double x[][N], int m, int n) {

   int    i,j;
   double d;

   for (i = 0; i <= m-1; i++) {
     for (j = 0; j <= n-1; j++) {
       fscanf(fdata, "%lf", &d);
       x[i][j] = d;
     }
   }
 }

 void matsum(double x[][N], double y[][N], double z[][N], int m, int n) {

   int i,j;

   for (i = 0; i <=m-1; i++) {
     for (j = 0; j <=n-1; j++) {
         z[i][j] = x[i][j]+y[i][j];
     }
   }
 }

 void matprod(double x[][M], double y[][N], double z[][N], int m, int k, int n) 
{

   int    i, j, r;
   double a;

   for (i = 0; i <= m-1; i++) {
     for (j = 0; j <= n-1; j++) {
       a = 0;
       for (r = 0; r <=k-1; r++) {
         a = a+x[i][r]*y[r][j];
       }
       z[i][j]=a;
     }
   }
 }

 
 

 void out_res(FILE *fout, double x[][N], int m, int n) {

   int i,j;

   for (i = 0; i <= m-1; i++) {
     for (j = 0; j <= n-1; j++) {
       printf(" %10.3f ", x[i][j]);
       fprintf(fout, " %10.3f ", x[i][j]);
     }
     printf("\n");
     fprintf(fout, "\n");
   }
 }





というプログラムを作ったんですが、これだと任意の行列では計算できません。NとMにどんな数字をいれても動作するようにするにはどこを変えればいいのでしょうか?

No.9818

Re:わからなくて困っています
投稿者---かずま(2003/10/16 03:52:06)


題名が不適切です。「行列演算」とでも書けばよいものを。

さて、double a[3][2]; と書く代わりに、
int m = 3, n = 2; doulbe *a = malloc(sizeof(double) * m * n);

a[i][j] の代わりに、a[i*n + j] と書くだけで済んでしまうようですが。


No.9838

Re:わからなくて困っています
投稿者---H(2003/10/17 00:00:12)


すみません。注意書きをよく読まないで書き込んでしまいました。
助かりました。ありがとうございます。