#include <iostream>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

int main()
{
	// 大きさ 2 のベクトル。
	boost::numeric::ublas::vector<double> x(2);
	boost::numeric::ublas::vector<double> y(2);
	boost::numeric::ublas::vector<double> z(2);

	// 値の代入。
	x(0) = 2.; x(1) = 1.;
	y(0) = 3.; y(1) = 5.;

	// ベクトルの和。
	z = x + y;

	// 表示。
	std::cout << z << "\n";

	// サイズ指定無しで宣言も出来る。
	boost::numeric::ublas::vector<double> w;
	std::cout << w.size() << "\n";

	// 結果を入れる変数はサイズ無し(0)でも大丈夫。
	w = x - y;

	std::cout << w.size() << "\n";
	std::cout << w << "\n";

	// 大きさ 2*2 の行列。
	boost::numeric::ublas::matrix<double> a(2, 2);

	a(0, 0) = 1.; a(0, 1) = 2.;
	a(1, 0) = 3.; a(1, 1) = 4.;

	// 行列やベクトルのスカラー倍。
	std::cout << 2. * a << "\n";
	std::cout << 2. * x << "\n";

	// 行列とベクトルの積は * でなくprodを用いる。
	y = prod(a, x);

	std::cout << y << "\n";

	// 内積。
	std::cout << inner_prod(x, y) << "\n";

	// 外積。
	std::cout << outer_prod(x, y) << "\n";

	// 転置。
	std::cout << trans(a) << "\n";

	// 大きさを変更することも出来る。
	x.resize(3);
	std::cout << x.size() << "\n";
	a.resize(3, 4);
	std::cout << a.size1() << "\n";
	std::cout << a.size2() << "\n";
}
