行列の内積を計算する。
二次元配列は多少面倒なので一次元配列で代用して計算する。
//==============================================
#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 件のコメント:
コメントを投稿