- T &element(unsigned, unsigned);
- const T &element(unsigned, unsigned) const;
- T &operator()(unsigned, unsigned);
- const T &operator()(unsigned, unsigned) const;
+ unsigned rows() const { return M; }
+ unsigned columns() const { return N; }
+
+ T &element(unsigned i, unsigned j) { return data[i+M*j]; }
+ const T &element(unsigned i, unsigned j) const { return data[i+M*j]; }
+ T &operator()(unsigned i, unsigned j) { return element(i, j); }
+ const T &operator()(unsigned i, unsigned j) const { return element(i, j); }
+
+ Vector<T, M> column(unsigned i) const { return Vector<T, M>(data+M*i); }
+ Vector<T, N> row(unsigned i) const { return Vector<T, N>(data+i, M); }
+
+ template<unsigned P, unsigned Q>
+ Matrix<T, P, Q> select(const Vector<unsigned, P> &, const Vector<unsigned, Q> &) const;
+
+ template<unsigned P, unsigned Q>
+ Matrix<T, P, Q> block(unsigned, unsigned) const;