バナナでもわかる話

計量経済学・統計学が専門の大学院生です。統計学・経済学・投資理論・マーケティング等々に関する勉強・解説ブログ。ときどき趣味も。極力数式は使わずイメージで説明出来るよう心掛けていますが、時々暴走します。

C++でベクトルの内積を行う関数を書いてみた

最近C++で数値計算が行えるよう練習中です。

スポンサーリンク



今回は、配列からベクトルを作って、足し算、引き算、割り算、内積を計算するコードを書いてみました。
うーん。一応出力は正しい値が出ていますが、もっと綺麗なコードを書きたい。
まあ、C++の勉強始めて少ししか経っていないので、これから頑張ります笑

ちなみに参考本はこちら

#include "pch.h"
#include <iostream>
//ベクトルサイズ
#define S 5
using namespace std;

まず、読み込みと定義から。#defineで特に重要な変数の値を定義することが出来ます。今回は要素数5のベクトルを考えることにします。
クラスとメンバ関数を定義してみました。

class Vect {
	double v[S];
	double vv[S];
	double plusres[S];
	double minusres[S];
	double divres[S];
	double IProdres;

public:
	void PrintVec(double v[S]) {
		cout << "ベクトルを表示する" << endl;
		for (int ii = 0; ii <S; ii++) {
			cout << v[ii]<<",";
		}
	}

	void plusVec(double v[S], double vv[S],double plusres[S]) {
		for (int ii = 0; ii < S; ii++) {
			plusres[ii] = v[ii] + vv[ii];
		}
	}

	void MinusVec(double v[S], double vv[S], double minusres[S]) {
		for (int ii = 0; ii < S; ii++) {
			minusres[ii] = v[ii] - vv[ii];
		}
	}

	void DivVec(double v[S], double vv[S], double divres[S]) {
		for (int ii = 0; ii < S; ii++) {
			divres[ii] = v[ii] / vv[ii];
		};
	}

	double InnerProd(double v[S], double vv[S]) {
		float IProdres = 0;
		for (int ii = 0; ii < S; ii++) {
			IProdres =IProdres + v[ii] * vv[ii];
		}
		return(IProdres);
	}
};

各メンバ関数の説明ですが
PrintVec関数:引数に1次元配列を入れるとベクトルを表示してくれる関数
plusVec関数:引数に同じ要素数の1次元配列を2つ入れ、結果出力用の配列も用意することで、足し算をしてくれる関数
MinusVec関数:plusVecの引き算バージョン
DivVec関数:plusVecの割り算バージョン
InnerProd関数:二種類の同じ要素数の1次元配列を二つ入れると、その内積を出力する関数


出力してみる。まず足し算

int main()
{
	Vect VV;
	double mA[S] = { 1,2,3,4,5 };
	double mmA[S] = { 2,3,4,5,6 };
	double vec_res[S];
	double res;
	//ベクトルの足し算
	VV.plusVec(mA, mmA,vec_res);
	cout << endl;
	VV.PrintVec(vec_res);
}

出力

ベクトルを表示する
3,5,7,9,11,

うまくいけてますね。
次は内積

int main()
{
	Vect VV;
	double mA[S] = { 1,2,3,4,5 };
	double mmA[S] = { 2,3,4,5,6 };
	double vec_res[S];
	double res;
	//ベクトルの内積
	res=VV.InnerProd(mA, mmA);
	cout << res << endl;
}

出力

70

うまく出てる!
エラー地獄は辛いですが、少しずつ出来ることが増えていくのがプログラミングの醍醐味ですね~。
次回は行列の演算をやってみます。