61 class _declspec(dllexport) matrix
64 using typeT =
typename std::enable_if<
65 std::is_same<Real, T>::value || std::is_same<Real_t, T>::value ||
66 std::is_same<int, T>::value ||
67 std::is_same<uchar, T>::value ||
68 std::is_same<Complex<Real>, T>::value || std::is_same<Complex<Real_t>, T>::value, T>::type;
73 matrix(
void) : size(1, 1) {
77 matrix(
int x,
int y) : size(x, y) {
81 matrix(ivec2 _size) : size(_size) {
85 matrix(
const matrix<T>& ref) : size(ref.size) {
87 for (
int x = 0; x < size[
_X]; x++)
88 for (
int y = 0; y < size[
_Y]; y++) {
89 mat[x][y] = ref.mat[x][y];
98 mat =
new std::vector<T>[size[0]];
99 for (
int x = 0; x < size[
_X]; x++) {
100 for (
int y = 0; y < size[
_Y]; y++) {
101 if (x == y && size[
_X] == size[
_Y])
115 oph::ivec2& getSize(
void) {
return size; }
117 matrix<T>& resize(
int x,
int y) {
120 size[0] = x; size[1] = y;
127 matrix<T>& identity(
void) {
128 if (size[
_X] != size[
_Y])
return *
this;
129 for (
int x = 0; x < size[
_X]; x++) {
130 for (
int y = 0; y < size[
_Y]; y++) {
140 matrix<T>& zeros(
void) {
141 for (
int col = 0; col < size[
_COL]; col++) {
142 for (
int row = 0; row < size[
_ROW]; row++) {
231 matrix<T>& add(matrix<T>& p) {
232 if (size != p.size)
return *
this;
234 for (
int x = 0; x < size[
_X]; x++) {
235 for (
int y = 0; y < size[
_Y]; y++) {
236 mat[x][y] += p[x][y];
243 matrix<T>& sub(matrix<T>& p) {
244 if (size != p.size)
return *
this;
246 for (
int x = 0; x < size[
_X]; x++) {
247 for (
int y = 0; y < size[
_Y]; y++) {
248 mat[x][y] -= p[x][y];
255 matrix<T>& mul(matrix<T>& p) {
256 if (size[
_X] != p.size[
_Y])
return *
this;
258 matrix<T> res(p.size[
_Y], size[
_X]);
260 for (
int x = 0; x < res.size[
_X]; x++) {
261 for (
int y = 0; y < res.size[
_Y]; y++) {
263 for (
int num = 0; num < p.size[
_X]; num++) {
264 res[x][y] += mat[x][num] * p[num][y];
268 this->resize(res.size[
_X], res.size[
_Y]);
274 matrix<T>& div(matrix<T>& p) {
275 if (size != p.size)
return *
this;
277 for (
int x = 0; x < size[
_X]; x++) {
278 for (
int y = 0; y < size[
_Y]; y++) {
279 if (p[x][y] == 0)
continue;
280 mat[x][y] /= p[x][y];
287 matrix<T>& mulElem(matrix<T>& p) {
288 if (size != p.size)
return *
this;
292 for (
int x = 0; x < res.size[
_X]; x++) {
293 for (
int y = 0; y < res.size[
_Y]; y++) {
295 res[x][y] = mat[x][y] * p.mat[x][y];
305 std::vector<T>& operator[](
const int index) {
309 T& operator ()(
int x,
int y) {
313 inline void operator =(matrix<T>& p) {
317 for (
int x = 0; x < size[
_X]; x++) {
318 for (
int y = 0; y < size[
_Y]; y++) {
324 inline void operator =(T* p) {
325 for (
int x = 0; x < size[
_X]; x++) {
326 for (
int y = 0; y < size[
_Y]; y++) {
370 for (
int x = 0; x < size[
_X]; x++) {
371 for (
int y = 0; y < size[
_Y]; y++) {
379 for (
int x = 0; x < size[
_X]; x++) {
380 for (
int y = 0; y < size[
_Y]; y++) {
388 for (
int x = 0; x < size[
_X]; x++) {
389 for (
int y = 0; y < size[
_Y]; y++) {
397 for (
int x = 0; x < size[
_X]; x++) {
398 for (
int y = 0; y < size[
_Y]; y++) {
oph::matrix< Complex< Real > > OphComplexField
oph::matrix< Real_t > OphRealTField
ivec2 operator-(const ivec2 &a, const ivec2 &b)
oph::matrix< int > OphIntField
ivec2 operator+(const ivec2 &a, const ivec2 &b)
oph::matrix< uchar > OphByteField
ivec2 operator*(const ivec2 &a, const ivec2 &b)
oph::matrix< Real > OphRealField
vec2 operator/(const vec2 &a, const vec2 &b)
oph::matrix< Complex< Real_t > > OphComplexTField