#include <iostream>
#include <valarray>
class Matrix {
int dim;
std::valarray<int> data;
public:
explicit Matrix(int dim, int init = 0)
: dim{dim}, data(init, dim*dim) {}
void clear(int value = 0) { data = value; }
void identity() { clear(); diagonal() = 1; }
int& operator()(int x, int y) { return data[dim * y + x]; }
std::slice_array<int> diagonal() {
return data[std::slice(0, dim, dim+1)];
}
std::slice_array<int> secondary_diagonal() {
return data[std::slice(dim-1, dim, dim-1)];
}
std::slice_array<int> row(std::size_t row) {
return data[std::slice(dim*row, dim, 1)];
}
std::slice_array<int> column(std::size_t col) {
return data[std::slice(col, dim, dim)];
}
void print(char term = '\n') const {
for (unsigned i = 0; i != data.size(); ++i)
std::cout << data[i] << (((i+1) % dim) ? ' ' : '\n');
std::cout << term;
}
};
int main()
{
Matrix m{3};
m.identity();
m.print();
m.clear(1);
m.secondary_diagonal() = 3;
m.print();
m.clear();
m.row(1) = std::valarray<int>{4, 5, 6};
m.print();
m.clear();
m.column(1) = std::valarray<int>{7, 8, 9};
m.print();
}
1 0 0
0 1 0
0 0 1
1 1 3
1 3 1
3 1 1
0 0 0
4 5 6
0 0 0
0 7 0
0 8 0
0 9 0