5回目 課題解答・解説
課題1)
#include <stdio.h> #include <math.h> const int dim = 2; typedef double Vec[dim]; void printVec(const Vec v){ //ベクトルの内容を画面に表示する関数(課題1-1) for(int i = 0; i < dim; i++){ printf("%f",v[i]); if(i != dim - 1) printf(" , "); else printf("\n"); } } void Vadd(Vec p, const Vec v1, const Vec v2){ //ベクトルの加算を行う関数(課題1-2) for(int i = 0; i < dim; i++){ p[i] = v1[i] + v2[i]; } } void Vsub(Vec p, const Vec v1, const Vec v2){ //ベクトルの減算を行う関数(課題1-2) for(int i = 0; i < dim; i++){ p[i] = v1[i] - v2[i]; } } double Vabs(const Vec v){ //ベクトルの絶対値を計算する関数(課題1-3) double abs = 0; for(int i = 0; i < dim; i++){ abs += v[i] * v[i]; } return sqrt(abs); } double inner_product(const Vec v1, const Vec v2){ //2つのベクトルの内積を計算する関数(課題1-4) double inn = 0; for(int i = 0; i < dim; i++){ inn += v1[i] * v2[i]; } return inn; } int main(void){ Vec v1 = {1.0, 3.0}; Vec v2 = {-2.0, 1.0}; Vec v3 = {0}; //きちんと動作しているか確認 printVec(v1); printVec(v2); Vadd(v3, v1, v2); printVec(v3); Vsub(v3, v1, v2); printVec(v3); return 0; } |
課題2)
#include <stdio.h> #include <math.h> const int dim = 8; typedef double Vec[dim]; void printVec(const Vec v){ //ベクトルの内容を画面に表示する関数 for(int i = 0; i < dim; i++){ printf("%f",v[i]); if(i != dim - 1) printf(" , "); else printf("\n"); } } void Vadd(Vec p, const Vec v1, const Vec v2){ //ベクトルの加算を行う関数 for(int i = 0; i < dim; i++){ p[i] = v1[i] + v2[i]; } } void Vsub(Vec p, const Vec v1, const Vec v2){ //ベクトルの減算を行う関数 for(int i = 0; i < dim; i++){ p[i] = v1[i] - v2[i]; } } double Vabs(const Vec v){ //ベクトルの絶対値を計算する関数 double abs = 0; for(int i = 0; i < dim; i++){ abs += v[i] * v[i]; } return sqrt(abs); } double inner_product(const Vec v1, const Vec v2){ //2つのベクトルの内積を計算する関数 double inn = 0; for(int i = 0; i < dim; i++){ inn += v1[i] * v2[i]; } return inn; } double corr(const Vec v1, const Vec v2){ //2つのベクトルの相互相関関数を計算する関数 return inner_product(v1, v2)/(Vabs(v1)*Vabs(v2)); } int main(void){ const int n = 4; /*Vec v1 = { 1, 2, 4, 5, 4, 1, -1, -2 }; Vec v2 = { 3, 3, 4, 6, 3, 2, 1, 1 }; Vec v3 = {-1, 2, 0, 2, -2, -1, 3, 1 }; Vec v4 = { 2, 1, 3, -9, 2, 8, 2, 8 };*/ //以下の様な宣言をすることで、ソースコードが簡略化できる。 Vec v[n] = {{ 1, 2, 4, 5, 4, 1, -1, -2 }, { 3, 3, 4, 6, 3, 2, 1, 1 }, {-1, 2, 0, 2, -2, -1, 3, 1 }, { 2, 1, 3, -9, 2, 8, 2, 8 }}; printf("\tlv1\tv2\tv3\tv4\n--------+--------------------------------\n"); for(int i = 0; i < n; i++){ //v1〜v4までそれぞれの相互相関関数を計算し、表示する。 printf("v%d\tl", i); for(int j = 0; j < n; j++){ printf("%+2.2f\t", corr(v[i], v[j])); } printf("\n"); } return 0; } |