#include <iostream>
#include <vector>
#include <assert.h>
#define M 2
#define N 2
template <class T>
class MatrixData {
public:
MatrixData(int xx, int yy) : col(xx), row(yy), Value(xx * yy) {}
MatrixData(int xx, int yy, const T& vv) : col(xx), row(yy), Value(xx * yy, vv) {}
friend class Matrix1D;
// proxy配列クラス
class Matrix1D {
public:
Matrix1D(MatrixData<T>& arr, int xx) : array(arr), XIndex(xx) {}
Matrix1D(const MatrixData<T>& arr, int xx) : array(arr), XIndex(xx) {}
T& operator[](int YIndex) {
return array.Value[array.row * XIndex + YIndex];
}
private:
int XIndex;
MatrixData<T>& array;
};
MatrixData<T> operator*(MatrixData<T>& md) {
int i, j, k;
MatrixData<T> tmp(col, md.row);
T sum;
// row == md.colの時しか乗算は定義出来ない
assert(row == md.col);
for (i = 0; i < row; i++)
for (j = 0; j < col; j++) {
sum = 0;
for (k = 0; k < md.col; k++)
sum += (*this)[i][k] * md[k][j];
tmp[i][j] = sum;
}
return tmp;
}
Matrix1D operator[](int Xindex) {
return Matrix1D(*this, Xindex);
}
//行列データを画面に表示する
void ShowMatrix()
{
int i, j;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++)
std::cout << (*this)[i][j] << ' ';
std::cout << std::endl;
}
}
//行列の第p行と第q行を入れ替える
void ChangeMatrix(int p, int q)
{
int i;
MatrixData<T> c = *this;
for (i = 0; i < col; i++) {
c[q][i] = (*this)[p][i];
c[p][i] = (*this)[q][i];
}
Value = c.Value;
}
private:
std::vector<T> Value;
int col;
int row;
};
int main(void)
{
MatrixData<double> a(M, N), b(M, N), c(M, N);
a[0][0] = 1.0;
a[0][1] = 2.0;
a[1][0] = 3.0;
a[1][1] = 4.0;
b[0][0] = 5.0;
b[0][1] = 6.0;
b[1][0] = 7.0;
b[1][1] = 8.0;
std::cout << std::fixed;
c = a * b;
c.ShowMatrix();
c.ChangeMatrix(0, 1);
c.ShowMatrix();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgojZGVmaW5lIE0gMgojZGVmaW5lIE4gMgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIE1hdHJpeERhdGEgewpwdWJsaWM6CiAgICBNYXRyaXhEYXRhKGludCB4eCwgaW50IHl5KSA6IGNvbCh4eCksIHJvdyh5eSksIFZhbHVlKHh4ICogeXkpIHt9CiAgICBNYXRyaXhEYXRhKGludCB4eCwgaW50IHl5LCBjb25zdCBUJiB2dikgOiBjb2woeHgpLCByb3coeXkpLCBWYWx1ZSh4eCAqIHl5LCB2dikge30KICBmcmllbmQgY2xhc3MgTWF0cml4MUQ7CiAgLy8gcHJveHnphY3liJfjgq/jg6njgrkKICBjbGFzcyBNYXRyaXgxRCB7CiAgcHVibGljOgogICAgTWF0cml4MUQoTWF0cml4RGF0YTxUPiYgYXJyLCBpbnQgeHgpIDogYXJyYXkoYXJyKSwgWEluZGV4KHh4KSB7fQogICAgTWF0cml4MUQoY29uc3QgTWF0cml4RGF0YTxUPiYgYXJyLCBpbnQgeHgpIDogYXJyYXkoYXJyKSwgWEluZGV4KHh4KSB7fQogICAgVCYgb3BlcmF0b3JbXShpbnQgWUluZGV4KSB7CiAgICAgIHJldHVybiBhcnJheS5WYWx1ZVthcnJheS5yb3cgKiBYSW5kZXggKyBZSW5kZXhdOwogICAgfQogIHByaXZhdGU6CiAgICBpbnQgWEluZGV4OwogICAgTWF0cml4RGF0YTxUPiYgYXJyYXk7CiAgfTsKICBNYXRyaXhEYXRhPFQ+IG9wZXJhdG9yKihNYXRyaXhEYXRhPFQ+JiBtZCkgewogICAgaW50IGksIGosIGs7CiAgICBNYXRyaXhEYXRhPFQ+IHRtcChjb2wsIG1kLnJvdyk7CiAgICBUIHN1bTsKCiAgICAvLyByb3cgPT0gbWQuY29s44Gu5pmC44GX44GL5LmX566X44Gv5a6a576p5Ye65p2l44Gq44GECgogICAgYXNzZXJ0KHJvdyA9PSBtZC5jb2wpOwoKICAgIGZvciAoaSA9IDA7IGkgPCByb3c7IGkrKykKICAgICAgZm9yIChqID0gMDsgaiA8IGNvbDsgaisrKSB7CiAgICAgICAgc3VtID0gMDsKICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbWQuY29sOyBrKyspCiAgICAgICAgICBzdW0gKz0gKCp0aGlzKVtpXVtrXSAqIG1kW2tdW2pdOwogICAgICAgIHRtcFtpXVtqXSA9IHN1bTsKICAgICAgfQoKICAgIHJldHVybiB0bXA7CiAgfQogIE1hdHJpeDFEIG9wZXJhdG9yW10oaW50IFhpbmRleCkgewogICAgcmV0dXJuIE1hdHJpeDFEKCp0aGlzLCBYaW5kZXgpOwogIH0KICAvL+ihjOWIl+ODh+ODvOOCv+OCkueUu+mdouOBq+ihqOekuuOBmeOCiwogIHZvaWQgU2hvd01hdHJpeCgpCiAgewogICBpbnQgaSwgajsKCiAgICBmb3IgKGkgPSAwOyBpIDwgcm93OyBpKyspIHsKICAgICAgZm9yIChqID0gMDsgaiA8IGNvbDsgaisrKQogICAgICAgIHN0ZDo6Y291dCA8PCAoKnRoaXMpW2ldW2pdIDw8ICcgJzsKICAgICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIH0KICB9CiAgLy/ooYzliJfjga7nrKxw6KGM44Go56ysceihjOOCkuWFpeOCjOabv+OBiOOCiwogIHZvaWQgQ2hhbmdlTWF0cml4KGludCBwLCBpbnQgcSkKICB7CiAgICBpbnQgaTsKICAgIE1hdHJpeERhdGE8VD4gYyA9ICp0aGlzOwoKICAgIGZvciAoaSA9IDA7IGkgPCBjb2w7IGkrKykgewogICAgICBjW3FdW2ldID0gKCp0aGlzKVtwXVtpXTsKICAgICAgY1twXVtpXSA9ICgqdGhpcylbcV1baV07CiAgICB9CgogICAgVmFsdWUgPSBjLlZhbHVlOwogIH0KcHJpdmF0ZToKICBzdGQ6OnZlY3RvcjxUPiBWYWx1ZTsKICBpbnQgY29sOwogIGludCByb3c7Cn07CgppbnQgbWFpbih2b2lkKQp7CiAgTWF0cml4RGF0YTxkb3VibGU+IGEoTSwgTiksIGIoTSwgTiksIGMoTSwgTik7CgogIGFbMF1bMF0gPSAxLjA7CiAgYVswXVsxXSA9IDIuMDsKICBhWzFdWzBdID0gMy4wOwogIGFbMV1bMV0gPSA0LjA7CiAgYlswXVswXSA9IDUuMDsKICBiWzBdWzFdID0gNi4wOwogIGJbMV1bMF0gPSA3LjA7CiAgYlsxXVsxXSA9IDguMDsKCiAgc3RkOjpjb3V0IDw8IHN0ZDo6Zml4ZWQ7CgogIGMgPSBhICogYjsKICBjLlNob3dNYXRyaXgoKTsKCiAgYy5DaGFuZ2VNYXRyaXgoMCwgMSk7CiAgYy5TaG93TWF0cml4KCk7Cn0K