2013年10月5日土曜日

行列の内積を計算する。


二次元配列は多少面倒なので一次元配列で代用して計算する。
//==============================================
#include <stdio.h>//printfに必要
#include <stdlib.h>//systemに必要
using namespace std;//systemに必要
//内積の計算
//
//A[a1][a2]・B[b1][b2]
//の内積を計算する。
double InnerProduct(int a1,double* A,double* B)
{
 double buf_InnerProduct=0;
 for(int count1=0;count1<a1;count1++){
  buf_InnerProduct+=(A[count1])*(B[count1]);
 }
 return buf_InnerProduct;
}

void main(void){
 //内積の計算テスト
 double A[8]={1,2,3,4,5,6,7,8};
 double B[8]={1,2,3,4,5,6,7,8};
 //実際は下のような二次元行列の計算なのだが、二次元行列で書くとコールバイリファレンスでの引き渡しが大変かつ使い勝手が悪くコードも汚くなりそうだったので一次元の配列で計算させる。
 //
 //double A[2][4]={{1,2,3,4},{5,6,7,8}};
 //double B[2][4]={{1,2,3,4},{5,6,7,8}};
 printf("%lf\n",InnerProduct(8,A,B));
 system("pause");
 //system("pause > NUL");
}
//==============================================




でもやっぱり二次元配列で計算したい……ので、以下
//==============================================
#include <stdio.h>//printfに必要
#include <stdlib.h>//systemに必要
using namespace std;//systemに必要
#define N1 2//動的確保は面倒なので定義しておく。
#define N2 4//動的確保は面倒なので定義しておく。
//内積の計算
//
//A[N1][N2]・B[N1][N2]
//の内積を計算する。
double InnerProduct(double A[N1][N2],double B[N1][N2])
{
 double buf_InnerProduct=0;
 for(int count1=0;count1<N1;count1++){
 for(int count2=0;count2<N2;count2++){
  buf_InnerProduct+=(A[count1][count2])*(B[count1][count2]);
 }
 }
 return buf_InnerProduct;
}

void main(void){
 //内積の計算テスト
 double A[2][4]={{1,2,3,4},{5,6,7,8}};
 double B[2][4]={{1,2,3,4},{5,6,7,8}};
 printf("%lf\n",InnerProduct(A,B));
 system("pause");
 //system("pause > NUL");
}
//==============================================


動的確保による計算は……気が向いたらやってみようかな?

0 件のコメント:

コメントを投稿