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;
}