行列演算library

template<typename T>
struct Matrix {
	vector<vector<T>> v;
	Matrix() :
			v(vector<vector<T>>(1)) {
	}
	Matrix(int h, int w) :
			v(vector<vector<T>>(h, vector<T>(w))) {
	}
	Matrix(initializer_list<initializer_list<T>> v) :
			v(v.begin(), v.end()) {
	}

	vector<T> operator[](const int i) const { //read
		return v[i];
	}
	vector<T>& operator[](const int i) { //write
		return v[i];
	}

	int r = v.size();
	int c = v[0].size();

	Matrix& operator=(const Matrix &a) {
		v = a.v;
		r = a.r;
		c = a.c;
		return *this;
	}
	Matrix& operator+=(const Matrix &a) {
		assert(c == a.c && r == a.r);
		for (int i = 0; i < r; ++i)
			for (int j = 0; j < c; ++j)
				v[i][j] += a[i][j];
		return *this;
	}
	Matrix& operator-=(const Matrix &a) {
		assert(c == a.c && r == a.r);
		for (int i = 0; i < r; ++i)
			for (int j = 0; j < c; ++j)
				v[i][j] -= a[i][j];
		return *this;
	}
	Matrix& operator*=(const Matrix &a) {
		assert(c == a.r);
		Matrix<T> m2(r, a.c);
		for (int i = 0; i < r; ++i)
			for (int j = 0; j < a.c; ++j)
				for (int k = 0; k < c; ++k)
					m2[i][j] += v[i][k] * a[k][j];
		c = a.c;
		for (int i = 0; i < r; ++i)
			v[i].resize(c);
		for (int i = 0; i < r; ++i)
			for (int j = 0; j < c; ++j)
				v[i][j] = m2[i][j];
		return *this;
	}
	Matrix operator+(const Matrix &a) const {
		return Matrix(*this) += a;
	}
	Matrix operator-(const Matrix &a) const {
		return Matrix(*this) -= a;
	}
	Matrix operator*(const Matrix &a) const {
		return Matrix(*this) *= a;
	}
	bool operator==(const Matrix &a) {
		assert(c == a.c && r == a.r);
		bool flg = true;
		for (int i = 0; i < r; ++i)
			for (int j = 0; j < c; ++j)
				if (v[i][j] != a[i][j])
					flg = false;
		return flg;
	}

	void show() {
		for (int i = 0; i < r; ++i)
			for (int j = 0; j < c; ++j)
				cout << v[i][j] << (j < c - 1 ? "\t" : "\n");
	}

};

ええんかこれで

この記事が気に入ったらサポートをしてみませんか?