行列演算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");
}
};
ええんかこれで
この記事が気に入ったらサポートをしてみませんか?