#include <iostream>
#include <memory>
class Matrix {
private:
int row;
int column;
std::shared_ptr<double> content;
public:
Matrix() : row(0), column(0), content(nullptr) {}
template<class... A> void set(int row, int column, A... args) {
double *array_content = new double[row * column];
double *p = array_content;
int n = 0;
for (double x : std::initializer_list<double>{args...}) {
*p = x;
p++; n++;
}
while (n < row * column) {
*p = 0.0;
p++; n++;
}
this->content.reset(array_content);
this->row = row;
this->column = column;
}
friend std::ostream &operator<<(std::ostream &os, Matrix &m) {
for (int r = 0; r < m.row; r++) {
for (int c = 0; c < m.column; c++) {
os << *(m.content.get() + r * m.column + c) << " ";
}
if (r < m.row - 1) os << std::endl;
}
return os;
}
friend Matrix operator*(Matrix &a, Matrix &b) {
Matrix m;
if (a.column != b.row)
return m;
m.row = a.row;
m.column = b.column;
double *array_content = new double[m.row * m.column];
for (int r = 0; r < m.row; r++) {
for (int c = 0; c < m.column; c++) {
double s = 0.0;
for (int k = 0; k < a.column; k++)
s += (*(a.content.get() + r * a.column + k) * *(b.content.get() + k * b.column + c));
*(array_content + r * m.column + c) = s;
}
}
m.content.reset(array_content);
return m;
}
~Matrix() {}
};
int main() {
Matrix a, b, m;
a.set(2, 2, 1.0, -2.0, 2.0, 3.0);
b.set(2, 2, -2.0, 1.0, 3.0, -1.0);
std::cout << a << std::endl;
std::cout << "-------------------------" << std::endl;
std::cout << b << std::endl;
std::cout << "-------------------------" << std::endl;
m = a * b;
std::cout << m << std::endl;
std::cout << "-------------------------" << std::endl;
m = b * a;
std::cout << m << std::endl;
std::cout << "-------------------------" << std::endl;
return 0;
}
/* end */
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgTWF0cml4IHsKcHJpdmF0ZToKICBpbnQgcm93OwogIGludCBjb2x1bW47CiAgc3RkOjpzaGFyZWRfcHRyPGRvdWJsZT4gY29udGVudDsKcHVibGljOgoKICBNYXRyaXgoKSA6IHJvdygwKSwgY29sdW1uKDApLCBjb250ZW50KG51bGxwdHIpIHt9CgogIHRlbXBsYXRlPGNsYXNzLi4uIEE+IHZvaWQgc2V0KGludCByb3csIGludCBjb2x1bW4sIEEuLi4gYXJncykgewogICAgZG91YmxlICphcnJheV9jb250ZW50ID0gbmV3IGRvdWJsZVtyb3cgKiBjb2x1bW5dOwogICAgZG91YmxlICpwID0gYXJyYXlfY29udGVudDsKICAgIGludCBuID0gMDsKICAgIGZvciAoZG91YmxlIHggOiBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8ZG91YmxlPnthcmdzLi4ufSkgewogICAgICAqcCA9IHg7CiAgICAgIHArKzsgbisrOwogICAgfQogICAgd2hpbGUgKG4gPCByb3cgKiBjb2x1bW4pIHsKICAgICAgKnAgPSAwLjA7CiAgICAgIHArKzsgbisrOwogICAgfQogICAgdGhpcy0+Y29udGVudC5yZXNldChhcnJheV9jb250ZW50KTsKICAgIHRoaXMtPnJvdyA9IHJvdzsKICAgIHRoaXMtPmNvbHVtbiA9IGNvbHVtbjsKICB9CiAgCiAgZnJpZW5kIHN0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm9zLCBNYXRyaXggJm0pIHsKICAgIGZvciAoaW50IHIgPSAwOyByIDwgbS5yb3c7IHIrKykgewogICAgICBmb3IgKGludCBjID0gMDsgYyA8IG0uY29sdW1uOyBjKyspIHsKICAgICAgICBvcyA8PCAqKG0uY29udGVudC5nZXQoKSArIHIgKiBtLmNvbHVtbiArIGMpIDw8ICIgIjsKICAgICAgfQogICAgICBpZiAociA8IG0ucm93IC0gMSkgb3MgPDwgc3RkOjplbmRsOwogICAgfQogICAgcmV0dXJuIG9zOwogIH0KCiAgZnJpZW5kIE1hdHJpeCBvcGVyYXRvciooTWF0cml4ICZhLCBNYXRyaXggJmIpIHsKICAgIE1hdHJpeCBtOwogICAgaWYgKGEuY29sdW1uICE9IGIucm93KQogICAgICByZXR1cm4gbTsKICAgIG0ucm93ID0gYS5yb3c7CiAgICBtLmNvbHVtbiA9IGIuY29sdW1uOwogICAgZG91YmxlICphcnJheV9jb250ZW50ID0gbmV3IGRvdWJsZVttLnJvdyAqIG0uY29sdW1uXTsKICAgIGZvciAoaW50IHIgPSAwOyByIDwgbS5yb3c7IHIrKykgewogICAgICBmb3IgKGludCBjID0gMDsgYyA8IG0uY29sdW1uOyBjKyspIHsKICAgICAgICBkb3VibGUgcyA9IDAuMDsKICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGEuY29sdW1uOyBrKyspCiAgICAgICAgICBzICs9ICgqKGEuY29udGVudC5nZXQoKSArIHIgKiBhLmNvbHVtbiArIGspICogKihiLmNvbnRlbnQuZ2V0KCkgKyBrICogYi5jb2x1bW4gKyBjKSk7CiAgICAgICAgKihhcnJheV9jb250ZW50ICsgciAqIG0uY29sdW1uICsgYykgPSBzOwogICAgICB9CiAgICB9CiAgICBtLmNvbnRlbnQucmVzZXQoYXJyYXlfY29udGVudCk7CiAgICByZXR1cm4gbTsKICB9CgoKICB+TWF0cml4KCkge30KfTsKCmludCBtYWluKCkgewogIE1hdHJpeCBhLCBiLCBtOwogIGEuc2V0KDIsIDIsICAxLjAsIC0yLjAsIDIuMCwgIDMuMCk7CiAgYi5zZXQoMiwgMiwgLTIuMCwgIDEuMCwgMy4wLCAtMS4wKTsKICAKICBzdGQ6OmNvdXQgPDwgYSA8PCBzdGQ6OmVuZGw7CiAgc3RkOjpjb3V0IDw8ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiA8PCBzdGQ6OmVuZGw7CiAgc3RkOjpjb3V0IDw8IGIgPDwgc3RkOjplbmRsOwogIHN0ZDo6Y291dCA8PCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIgPDwgc3RkOjplbmRsOwoKICBtID0gYSAqIGI7CgogIHN0ZDo6Y291dCA8PCBtIDw8IHN0ZDo6ZW5kbDsKICBzdGQ6OmNvdXQgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDw8IHN0ZDo6ZW5kbDsKICAKICBtID0gYiAqIGE7CgogIHN0ZDo6Y291dCA8PCBtIDw8IHN0ZDo6ZW5kbDsKICBzdGQ6OmNvdXQgPDwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIDw8IHN0ZDo6ZW5kbDsKCiAgcmV0dXJuIDA7Cn0KLyogZW5kICovCg==