@zushah/chalkboard 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -54,7 +54,7 @@ var Chalkboard;
54
54
  return Chalkboard.vect.init(callback(vect.x), callback(vect.y), callback(vect.z), callback(vect.w));
55
55
  }
56
56
  else {
57
- throw new TypeError("Parameter \"object\" must be of type \"ChalkboardComplex\", \"ChalkboardMatrix\", \"ChalkboardQuaternion\", \"ChalkboardTensor\", or \"ChalkboardVector\".");
57
+ throw new TypeError('Parameter "object" must be of type "ChalkboardComplex", "ChalkboardMatrix", "ChalkboardQuaternion", "ChalkboardTensor", or "ChalkboardVector".');
58
58
  }
59
59
  };
60
60
  Chalkboard.CONTEXT = typeof window !== "undefined" ? "ctx" : "0";
@@ -62,14 +62,14 @@ var Chalkboard;
62
62
  if (exponent === void 0) { exponent = 1; }
63
63
  return Math.pow(Math.pow(10, 1 / Math.log(10)), exponent);
64
64
  };
65
- Chalkboard.LOGO = function (x, y, s, context) {
65
+ Chalkboard.LOGO = function (x, y, size, context) {
66
66
  if (x === void 0) { x = Chalkboard.real.parse(Chalkboard.CONTEXT).canvas.width / 2; }
67
67
  if (y === void 0) { y = Chalkboard.real.parse(Chalkboard.CONTEXT).canvas.height / 2; }
68
- if (s === void 0) { s = 1; }
68
+ if (size === void 0) { size = 1; }
69
69
  if (context === void 0) { context = Chalkboard.real.parse(Chalkboard.CONTEXT); }
70
70
  context.save();
71
71
  context.translate(x, y);
72
- context.scale(s, s);
72
+ context.scale(size, size);
73
73
  context.fillStyle = "rgb(25, 25, 25)";
74
74
  context.beginPath();
75
75
  context.ellipse(0, 0, 50, 50, 0, 0, Chalkboard.PI(2));
@@ -105,10 +105,10 @@ var Chalkboard;
105
105
  Chalkboard.VERSION +
106
106
  " " +
107
107
  Chalkboard.VERSIONALIAS +
108
- " released 01/08/2024\nAuthored by Zushah ===> https://www.github.com/Zushah\nAvailable under the MIT License ===> https://www.opensource.org/license/mit/\n\nThe Chalkboard library is a JavaScript namespace that provides a plethora of both practical and abstract mathematical functionalities for its user.\n\nRepository ===> https://www.github.com/Zushah/Chalkboard\nWebsite ===> https://zushah.github.io/Chalkboard");
108
+ " released 01/22/2024\nAuthored by Zushah ===> https://www.github.com/Zushah\nAvailable under the MIT License ===> https://www.opensource.org/license/mit/\n\nThe Chalkboard library is a JavaScript namespace that provides a plethora of both practical and abstract mathematical functionalities for its user.\n\nRepository ===> https://www.github.com/Zushah/Chalkboard\nWebsite ===> https://zushah.github.io/Chalkboard");
109
109
  };
110
- Chalkboard.VERSION = "2.0.0";
111
- Chalkboard.VERSIONALIAS = "al-Khwarizmi";
110
+ Chalkboard.VERSION = "2.1.0";
111
+ Chalkboard.VERSIONALIAS = "Seki";
112
112
  })(Chalkboard || (Chalkboard = {}));
113
113
  if (typeof window === "undefined") {
114
114
  module.exports = Chalkboard;
@@ -319,8 +319,8 @@ var Chalkboard;
319
319
  var dt = (tsup - tinf) / 100, ds = (ssup - sinf) / 100;
320
320
  for (var s = sinf; s <= ssup; s += ds) {
321
321
  for (var t = tinf; t <= tsup; t += dt) {
322
- drds = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vect.init(s, t)), 3, "col", 1);
323
- drdt = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vect.init(s, t)), 3, "col", 2);
322
+ drds = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vect.init(s, t)), 3, 0, 0);
323
+ drdt = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vect.init(s, t)), 3, 1, 0);
324
324
  result += Chalkboard.vect.mag(Chalkboard.vect.cross(drds, drdt));
325
325
  }
326
326
  }
@@ -357,8 +357,8 @@ var Chalkboard;
357
357
  var dt = (tsup - tinf) / 100, ds = (ssup - sinf) / 100;
358
358
  for (var s = sinf; s <= ssup; s += ds) {
359
359
  for (var t = tinf; t <= tsup; t += dt) {
360
- drds = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vect.init(s, t)), 3, "col", 1);
361
- drdt = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vect.init(s, t)), 3, "col", 2);
360
+ drds = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vect.init(s, t)), 3, 0, 0);
361
+ drdt = Chalkboard.matr.toVector(Chalkboard.calc.grad(func, Chalkboard.vect.init(s, t)), 3, 1, 0);
362
362
  result += Chalkboard.vect.scalarTriple(Chalkboard.vect.fromField(vectfield, Chalkboard.real.val(func, Chalkboard.vect.init(s, t))), drds, drdt);
363
363
  }
364
364
  }
@@ -670,6 +670,9 @@ var Chalkboard;
670
670
  comp_1.arg = function (comp) {
671
671
  return Chalkboard.trig.arctan2(comp.b, comp.a);
672
672
  };
673
+ comp_1.argBetween = function (comp1, comp2) {
674
+ return Chalkboard.vect.angBetween(Chalkboard.comp.toVector(comp1), Chalkboard.comp.toVector(comp2));
675
+ };
673
676
  comp_1.conjugate = function (comp) {
674
677
  return Chalkboard.comp.init(comp.a, -comp.b);
675
678
  };
@@ -810,6 +813,9 @@ var Chalkboard;
810
813
  comp_1.toArray = function (comp) {
811
814
  return [comp.a, comp.b];
812
815
  };
816
+ comp_1.toMatrix = function (comp) {
817
+ return Chalkboard.matr.init([comp.a, -comp.b], [comp.b, comp.a]);
818
+ };
813
819
  comp_1.toString = function (comp) {
814
820
  if (comp.b >= 0) {
815
821
  return comp.a.toString() + " + " + comp.b.toString() + "i";
@@ -995,32 +1001,54 @@ var Chalkboard;
995
1001
  var matr;
996
1002
  (function (matr_1) {
997
1003
  matr_1.absolute = function (matr) {
998
- var result = Chalkboard.matr.init();
999
- for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1000
- result[i] = [];
1001
- for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1002
- result[i][j] = Math.abs(matr[i][j]);
1003
- }
1004
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
1005
+ return Chalkboard.matr.init([Math.abs(matr[0][0]), Math.abs(matr[0][1])], [Math.abs(matr[1][0]), Math.abs(matr[1][1])]);
1004
1006
  }
1005
- return result;
1006
- };
1007
- matr_1.add = function (matr1, matr2) {
1008
- if (Chalkboard.matr.rows(matr1) === Chalkboard.matr.rows(matr2) && Chalkboard.matr.cols(matr1) === Chalkboard.matr.cols(matr2)) {
1007
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
1008
+ return Chalkboard.matr.init([Math.abs(matr[0][0]), Math.abs(matr[0][1]), Math.abs(matr[0][2])], [Math.abs(matr[1][0]), Math.abs(matr[1][1]), Math.abs(matr[1][2])], [Math.abs(matr[2][0]), Math.abs(matr[2][1]), Math.abs(matr[2][2])]);
1009
+ }
1010
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
1011
+ return Chalkboard.matr.init([Math.abs(matr[0][0]), Math.abs(matr[0][1]), Math.abs(matr[0][2]), Math.abs(matr[0][3])], [Math.abs(matr[1][0]), Math.abs(matr[1][1]), Math.abs(matr[1][2]), Math.abs(matr[1][3])], [Math.abs(matr[2][0]), Math.abs(matr[2][1]), Math.abs(matr[2][2]), Math.abs(matr[2][3])], [Math.abs(matr[3][0]), Math.abs(matr[3][1]), Math.abs(matr[3][2]), Math.abs(matr[3][3])]);
1012
+ }
1013
+ else {
1009
1014
  var result = Chalkboard.matr.init();
1010
- for (var i = 0; i < Chalkboard.matr.rows(matr1); i++) {
1015
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1011
1016
  result[i] = [];
1012
- for (var j = 0; j < Chalkboard.matr.cols(matr1); j++) {
1013
- result[i][j] = matr1[i][j] + matr2[i][j];
1017
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1018
+ result[i][j] = Math.abs(matr[i][j]);
1014
1019
  }
1015
1020
  }
1016
1021
  return result;
1017
1022
  }
1023
+ };
1024
+ matr_1.add = function (matr1, matr2) {
1025
+ if (Chalkboard.matr.isSizeEqual(matr1, matr2)) {
1026
+ if (Chalkboard.matr.isSizeOf(matr1, 2)) {
1027
+ return Chalkboard.matr.init([matr1[0][0] + matr2[0][0], matr1[0][1] + matr2[0][1]], [matr1[1][0] + matr2[1][0], matr1[1][1] + matr2[1][1]]);
1028
+ }
1029
+ else if (Chalkboard.matr.isSizeOf(matr1, 3)) {
1030
+ return Chalkboard.matr.init([matr1[0][0] + matr2[0][0], matr1[0][1] + matr2[0][1], matr1[0][2] + matr2[0][2]], [matr1[1][0] + matr2[1][0], matr1[1][1] + matr2[1][1], matr1[1][2] + matr2[1][2]], [matr1[2][0] + matr2[2][0], matr1[2][1] + matr2[2][1], matr1[2][2] + matr2[2][2]]);
1031
+ }
1032
+ else if (Chalkboard.matr.isSizeOf(matr1, 4)) {
1033
+ return Chalkboard.matr.init([matr1[0][0] + matr2[0][0], matr1[0][1] + matr2[0][1], matr1[0][2] + matr2[0][2], matr1[0][3] + matr2[0][3]], [matr1[1][0] + matr2[1][0], matr1[1][1] + matr2[1][1], matr1[1][2] + matr2[1][2], matr1[1][3] + matr2[1][3]], [matr1[2][0] + matr2[2][0], matr1[2][1] + matr2[2][1], matr1[2][2] + matr2[2][2], matr1[2][3] + matr2[2][3]], [matr1[3][0] + matr2[3][0], matr1[3][1] + matr2[3][1], matr1[3][2] + matr2[3][2], matr1[3][3] + matr2[3][3]]);
1034
+ }
1035
+ else {
1036
+ var result = Chalkboard.matr.init();
1037
+ for (var i = 0; i < Chalkboard.matr.rows(matr1); i++) {
1038
+ result[i] = [];
1039
+ for (var j = 0; j < Chalkboard.matr.cols(matr1); j++) {
1040
+ result[i][j] = matr1[i][j] + matr2[i][j];
1041
+ }
1042
+ }
1043
+ return result;
1044
+ }
1045
+ }
1018
1046
  else {
1019
1047
  throw new TypeError('Parameters "matr1" and "matr2" must be of type "ChalkboardMatrix" with equivalent numbers of rows and columns.');
1020
1048
  }
1021
1049
  };
1022
1050
  matr_1.addKronecker = function (matr1, matr2) {
1023
- if (Chalkboard.matr.rows(matr1) === Chalkboard.matr.cols(matr1) && Chalkboard.matr.rows(matr2) === Chalkboard.matr.cols(matr2)) {
1051
+ if (Chalkboard.matr.isSquare(matr1) && Chalkboard.matr.isSquare(matr2)) {
1024
1052
  return Chalkboard.matr.add(Chalkboard.matr.mulKronecker(matr1, Chalkboard.matr.identity(Chalkboard.matr.rows(matr1))), Chalkboard.matr.mulKronecker(Chalkboard.matr.identity(Chalkboard.matr.rows(matr2)), matr2));
1025
1053
  }
1026
1054
  else {
@@ -1030,33 +1058,12 @@ var Chalkboard;
1030
1058
  matr_1.adjugate = function (matr, row, col) {
1031
1059
  return Chalkboard.matr.transpose(Chalkboard.matr.cofactor(matr, row, col));
1032
1060
  };
1033
- matr_1.binomial = function (size, type) {
1034
- if (type === void 0) { type = "lower"; }
1035
- var result = Chalkboard.matr.init();
1036
- for (var i = 0; i < size; i++) {
1037
- result.push([]);
1038
- for (var j = 0; j < size; j++) {
1039
- if (type === "lower") {
1040
- result[i].push(Chalkboard.numb.binomial(i, j));
1041
- }
1042
- else if (type === "upper") {
1043
- result[i].push(Chalkboard.numb.binomial(j, i));
1044
- }
1045
- }
1046
- }
1047
- if (type === "symmetric") {
1048
- return Chalkboard.matr.mul(Chalkboard.matr.binomial(size, "lower"), Chalkboard.matr.binomial(size, "upper"));
1049
- }
1050
- else {
1051
- return result;
1052
- }
1053
- };
1054
1061
  matr_1.cofactor = function (matr, row, col) {
1055
1062
  return matr
1056
- .slice(0, row - 1)
1057
- .concat(matr.slice(row))
1063
+ .slice(0, row)
1064
+ .concat(matr.slice(row + 1))
1058
1065
  .map(function (row) {
1059
- return row.slice(0, col - 1).concat(row.slice(col));
1066
+ return row.slice(0, col).concat(row.slice(col + 1));
1060
1067
  });
1061
1068
  };
1062
1069
  matr_1.cols = function (matr) {
@@ -1065,65 +1072,152 @@ var Chalkboard;
1065
1072
  matr_1.colspace = function (matr) {
1066
1073
  return Chalkboard.matr.transpose(Chalkboard.matr.rowspace(Chalkboard.matr.transpose(matr)));
1067
1074
  };
1068
- matr_1.concat = function (matr1, matr2, type) {
1069
- if (type === void 0) { type = "row"; }
1070
- if (type === "row") {
1071
- if (Chalkboard.matr.rows(matr1) === Chalkboard.matr.rows(matr2)) {
1072
- return Chalkboard.matr.init(matr1.concat(matr2));
1075
+ matr_1.concat = function (matr1, matr2, axis) {
1076
+ if (axis === void 0) { axis = 0; }
1077
+ if (axis === 0) {
1078
+ if (Chalkboard.matr.cols(matr1) === Chalkboard.matr.cols(matr2)) {
1079
+ if (Chalkboard.matr.isSizeOf(matr1, 2) && Chalkboard.matr.rows(matr2) === 2) {
1080
+ return Chalkboard.matr.init([matr1[0][0], matr1[0][1]], [matr1[1][0], matr1[1][1]], [matr2[0][0], matr2[0][1]], [matr2[1][0], matr2[1][1]]);
1081
+ }
1082
+ else if (Chalkboard.matr.isSizeOf(matr1, 3) && Chalkboard.matr.rows(matr2) === 3) {
1083
+ return Chalkboard.matr.init([matr1[0][0], matr1[0][1], matr1[0][2]], [matr1[1][0], matr1[1][1], matr1[1][2]], [matr1[2][0], matr1[2][1], matr1[2][2]], [matr2[0][0], matr2[0][1], matr2[0][2]], [matr2[1][0], matr2[1][1], matr2[1][2]], [matr2[2][0], matr2[2][1], matr2[2][2]]);
1084
+ }
1085
+ else if (Chalkboard.matr.isSizeOf(matr1, 4) && Chalkboard.matr.rows(matr2) === 4) {
1086
+ return Chalkboard.matr.init([matr1[0][0], matr1[0][1], matr1[0][2], matr1[0][3]], [matr1[1][0], matr1[1][1], matr1[1][2], matr1[1][3]], [matr1[2][0], matr1[2][1], matr1[2][2], matr1[2][3]], [matr1[3][0], matr1[3][1], matr1[3][2], matr1[3][3]], [matr2[0][0], matr2[0][1], matr2[0][2], matr2[0][3]], [matr2[1][0], matr2[1][1], matr2[1][2], matr2[1][3]], [matr2[2][0], matr2[2][1], matr2[2][2], matr2[2][3]], [matr2[3][0], matr2[3][1], matr2[3][2], matr2[3][3]]);
1087
+ }
1088
+ else {
1089
+ return Chalkboard.matr.init(matr1.concat(matr2));
1090
+ }
1073
1091
  }
1074
1092
  else {
1075
- throw new TypeError('Parameters "matr1" and "matr2" must be of type "ChalkboardMatrix" with equivalent numbers of rows.');
1093
+ throw new TypeError('Parameters "matr1" and "matr2" must be of type "ChalkboardMatrix" with equivalent numbers of columns.');
1076
1094
  }
1077
1095
  }
1078
- else if (type === "col") {
1079
- if (Chalkboard.matr.cols(matr1) === Chalkboard.matr.cols(matr2)) {
1080
- var result = Chalkboard.matr.init();
1081
- for (var i = 0; i < Chalkboard.matr.rows(matr1); i++) {
1082
- result.push(matr1[i].concat(matr2[i]));
1096
+ else if (axis === 1) {
1097
+ if (Chalkboard.matr.rows(matr1) === Chalkboard.matr.rows(matr2)) {
1098
+ if (Chalkboard.matr.isSizeOf(matr1, 2) && Chalkboard.matr.cols(matr2) === 2) {
1099
+ return Chalkboard.matr.init([matr1[0][0], matr1[0][1], matr2[0][0], matr2[0][1]], [matr1[1][0], matr1[1][1], matr2[1][0], matr2[1][1]]);
1100
+ }
1101
+ else if (Chalkboard.matr.isSizeOf(matr1, 3) && Chalkboard.matr.cols(matr2) === 3) {
1102
+ return Chalkboard.matr.init([matr1[0][0], matr1[0][1], matr1[0][2], matr2[0][0], matr2[0][1], matr2[0][2]], [matr1[1][0], matr1[1][1], matr1[1][2], matr2[1][0], matr2[1][1], matr2[1][2]], [matr1[2][0], matr1[2][1], matr1[2][2], matr2[2][0], matr2[2][1], matr2[2][2]]);
1103
+ }
1104
+ else if (Chalkboard.matr.isSizeOf(matr1, 4) && Chalkboard.matr.cols(matr2) === 4) {
1105
+ return Chalkboard.matr.init([matr1[0][0], matr1[0][1], matr1[0][2], matr1[0][3], matr2[0][0], matr2[0][1], matr2[0][2], matr2[0][3]], [matr1[1][0], matr1[1][1], matr1[1][2], matr1[1][3], matr2[1][0], matr2[1][1], matr2[1][2], matr2[1][3]], [matr1[2][0], matr1[2][1], matr1[2][2], matr1[2][3], matr2[2][0], matr2[2][1], matr2[2][2], matr2[2][3]], [matr1[3][0], matr1[3][1], matr1[3][2], matr1[3][3], matr2[3][0], matr2[3][1], matr2[3][2], matr2[3][3]]);
1106
+ }
1107
+ else {
1108
+ var result = Chalkboard.matr.init();
1109
+ for (var i = 0; i < Chalkboard.matr.rows(matr1); i++) {
1110
+ result.push(matr1[i].concat(matr2[i]));
1111
+ }
1112
+ return result;
1083
1113
  }
1084
- return result;
1085
1114
  }
1086
1115
  else {
1087
- throw new TypeError('Parameters "matr1" and "matr2" must be of type "ChalkboardMatrix" with equivalent numbers of columns.');
1116
+ throw new TypeError('Parameters "matr1" and "matr2" must be of type "ChalkboardMatrix" with equivalent numbers of rows.');
1088
1117
  }
1089
1118
  }
1090
1119
  else {
1091
- throw new TypeError('Parameter "type" must be "row" or "col".');
1120
+ throw new TypeError('Parameter "axis" must be 0 or 1.');
1092
1121
  }
1093
1122
  };
1094
1123
  matr_1.constrain = function (matr, range) {
1095
1124
  if (range === void 0) { range = [0, 1]; }
1096
- var result = Chalkboard.matr.init();
1097
- for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1098
- result[i] = [];
1099
- for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1100
- result[i][j] = Chalkboard.numb.constrain(matr[i][j], range);
1125
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
1126
+ return Chalkboard.matr.init([Chalkboard.numb.constrain(matr[0][0], range), Chalkboard.numb.constrain(matr[0][1], range)], [Chalkboard.numb.constrain(matr[1][0], range), Chalkboard.numb.constrain(matr[1][1], range)]);
1127
+ }
1128
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
1129
+ return Chalkboard.matr.init([Chalkboard.numb.constrain(matr[0][0], range), Chalkboard.numb.constrain(matr[0][1], range), Chalkboard.numb.constrain(matr[0][2], range)], [Chalkboard.numb.constrain(matr[1][0], range), Chalkboard.numb.constrain(matr[1][1], range), Chalkboard.numb.constrain(matr[1][2], range)], [Chalkboard.numb.constrain(matr[2][0], range), Chalkboard.numb.constrain(matr[2][1], range), Chalkboard.numb.constrain(matr[2][2], range)]);
1130
+ }
1131
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
1132
+ return Chalkboard.matr.init([
1133
+ Chalkboard.numb.constrain(matr[0][0], range),
1134
+ Chalkboard.numb.constrain(matr[0][1], range),
1135
+ Chalkboard.numb.constrain(matr[0][2], range),
1136
+ Chalkboard.numb.constrain(matr[0][3], range)
1137
+ ], [
1138
+ Chalkboard.numb.constrain(matr[1][0], range),
1139
+ Chalkboard.numb.constrain(matr[1][1], range),
1140
+ Chalkboard.numb.constrain(matr[1][2], range),
1141
+ Chalkboard.numb.constrain(matr[1][3], range)
1142
+ ], [
1143
+ Chalkboard.numb.constrain(matr[2][0], range),
1144
+ Chalkboard.numb.constrain(matr[2][1], range),
1145
+ Chalkboard.numb.constrain(matr[2][2], range),
1146
+ Chalkboard.numb.constrain(matr[2][3], range)
1147
+ ], [
1148
+ Chalkboard.numb.constrain(matr[3][0], range),
1149
+ Chalkboard.numb.constrain(matr[3][1], range),
1150
+ Chalkboard.numb.constrain(matr[3][2], range),
1151
+ Chalkboard.numb.constrain(matr[3][3], range)
1152
+ ]);
1153
+ }
1154
+ else {
1155
+ var result = Chalkboard.matr.init();
1156
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1157
+ result[i] = [];
1158
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1159
+ result[i][j] = Chalkboard.numb.constrain(matr[i][j], range);
1160
+ }
1101
1161
  }
1162
+ return result;
1102
1163
  }
1103
- return result;
1104
1164
  };
1105
1165
  matr_1.copy = function (matr) {
1106
- var result = Chalkboard.matr.init();
1107
- for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1108
- result.push([]);
1109
- for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1110
- result[i].push(matr[i][j]);
1166
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
1167
+ return Chalkboard.matr.init([matr[0][0], matr[0][1]], [matr[1][0], matr[1][1]]);
1168
+ }
1169
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
1170
+ return Chalkboard.matr.init([matr[0][0], matr[0][1], matr[0][2]], [matr[1][0], matr[1][1], matr[1][2]], [matr[2][0], matr[2][1], matr[2][2]]);
1171
+ }
1172
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
1173
+ return Chalkboard.matr.init([matr[0][0], matr[0][1], matr[0][2], matr[0][3]], [matr[1][0], matr[1][1], matr[1][2], matr[1][3]], [matr[2][0], matr[2][1], matr[2][2], matr[2][3]], [matr[3][0], matr[3][1], matr[3][2], matr[3][3]]);
1174
+ }
1175
+ else {
1176
+ var result = Chalkboard.matr.init();
1177
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1178
+ result.push([]);
1179
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1180
+ result[i].push(matr[i][j]);
1181
+ }
1111
1182
  }
1183
+ return result;
1112
1184
  }
1113
- return result;
1114
1185
  };
1115
1186
  matr_1.det = function (matr) {
1116
- if (Chalkboard.matr.rows(matr) === Chalkboard.matr.cols(matr)) {
1117
- var result = 0;
1187
+ if (Chalkboard.matr.isSquare(matr)) {
1118
1188
  if (Chalkboard.matr.rows(matr) === 1) {
1119
1189
  return matr[0][0];
1120
1190
  }
1121
1191
  else if (Chalkboard.matr.rows(matr) === 2) {
1122
1192
  return matr[0][0] * matr[1][1] - matr[0][1] * matr[1][0];
1123
1193
  }
1194
+ else if (Chalkboard.matr.rows(matr) === 3) {
1195
+ return (matr[0][0] * (matr[1][1] * matr[2][2] - matr[1][2] * matr[2][1]) -
1196
+ matr[0][1] * (matr[1][0] * matr[2][2] - matr[1][2] * matr[2][0]) +
1197
+ matr[0][2] * (matr[1][0] * matr[2][1] - matr[1][1] * matr[2][0]));
1198
+ }
1199
+ else if (Chalkboard.matr.rows(matr) === 4) {
1200
+ return (matr[0][0] *
1201
+ (matr[1][1] * (matr[2][2] * matr[3][3] - matr[2][3] * matr[3][2]) -
1202
+ matr[1][2] * (matr[2][1] * matr[3][3] - matr[2][3] * matr[3][1]) +
1203
+ matr[1][3] * (matr[2][1] * matr[3][2] - matr[2][2] * matr[3][1])) -
1204
+ matr[0][1] *
1205
+ (matr[1][0] * (matr[2][2] * matr[3][3] - matr[2][3] * matr[3][2]) -
1206
+ matr[1][2] * (matr[2][0] * matr[3][3] - matr[2][3] * matr[3][0]) +
1207
+ matr[1][3] * (matr[2][0] * matr[3][2] - matr[2][2] * matr[3][0])) +
1208
+ matr[0][2] *
1209
+ (matr[1][0] * (matr[2][1] * matr[3][3] - matr[2][3] * matr[3][1]) -
1210
+ matr[1][1] * (matr[2][0] * matr[3][3] - matr[2][3] * matr[3][0]) +
1211
+ matr[1][3] * (matr[2][0] * matr[3][1] - matr[2][1] * matr[3][0])) -
1212
+ matr[0][3] *
1213
+ (matr[1][0] * (matr[2][1] * matr[3][2] - matr[2][2] * matr[3][1]) -
1214
+ matr[1][1] * (matr[2][0] * matr[3][2] - matr[2][2] * matr[3][0]) +
1215
+ matr[1][2] * (matr[2][0] * matr[3][1] - matr[2][1] * matr[3][0])));
1216
+ }
1124
1217
  else {
1218
+ var result = 0;
1125
1219
  for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1126
- var cofactor_1 = matr[0][i] * Chalkboard.matr.det(Chalkboard.matr.cofactor(matr, 1, i + 1));
1220
+ var cofactor_1 = matr[0][i] * Chalkboard.matr.det(Chalkboard.matr.cofactor(matr, 0, i));
1127
1221
  result += i % 2 === 0 ? cofactor_1 : -cofactor_1;
1128
1222
  }
1129
1223
  return result;
@@ -1133,56 +1227,211 @@ var Chalkboard;
1133
1227
  throw new TypeError('Parameter "matr" must be of type "ChalkboardMatrix" that is square.');
1134
1228
  }
1135
1229
  };
1230
+ matr_1.diagonal = function (size) {
1231
+ var elements = [];
1232
+ for (var _i = 1; _i < arguments.length; _i++) {
1233
+ elements[_i - 1] = arguments[_i];
1234
+ }
1235
+ if (size === 2) {
1236
+ return Chalkboard.matr.init([elements[0] || 0, 0], [0, elements[1] || 0]);
1237
+ }
1238
+ else if (size === 3) {
1239
+ return Chalkboard.matr.init([elements[0] || 0, 0, 0], [0, elements[1] || 0, 0], [0, 0, elements[2] || 0]);
1240
+ }
1241
+ else if (size === 4) {
1242
+ return Chalkboard.matr.init([elements[0] || 0, 0, 0, 0], [0, elements[1] || 0, 0, 0], [0, 0, elements[2] || 0, 0], [0, 0, 0, elements[3] || 0]);
1243
+ }
1244
+ else {
1245
+ elements = Array.isArray(elements[0]) ? elements[0] : elements;
1246
+ var result = Chalkboard.matr.init();
1247
+ for (var i = 0; i < size; i++) {
1248
+ result.push(Array(size).fill(0));
1249
+ result[i][i] = elements[i] || 0;
1250
+ }
1251
+ return result;
1252
+ }
1253
+ };
1254
+ matr_1.eigenvalue = function (matr, maxIterations) {
1255
+ if (maxIterations === void 0) { maxIterations = 100; }
1256
+ var v = Chalkboard.matr.fill(1, Chalkboard.matr.rows(matr), 1);
1257
+ var _loop_1 = function (i) {
1258
+ var matrv = Chalkboard.matr.mul(matr, v);
1259
+ var max = Chalkboard.stat.max(Chalkboard.matr.toArray(Chalkboard.matr.absolute(matrv)));
1260
+ v = Chalkboard.stat.toMatrix(Chalkboard.matr.toArray(matrv).map(function (i) {
1261
+ return i / max;
1262
+ }), Chalkboard.matr.rows(matr), 1);
1263
+ };
1264
+ for (var i = 0; i < maxIterations; i++) {
1265
+ _loop_1(i);
1266
+ }
1267
+ var dot = function (v1, v2) {
1268
+ var result = 0;
1269
+ for (var i = 0; i < v1.length; i++) {
1270
+ result += v1[i] * v2[i];
1271
+ }
1272
+ return result;
1273
+ };
1274
+ return (dot(Chalkboard.matr.toArray(Chalkboard.matr.transpose(v)), Chalkboard.matr.toArray(Chalkboard.matr.mul(matr, v))) /
1275
+ dot(Chalkboard.matr.toArray(Chalkboard.matr.transpose(v)), Chalkboard.matr.toArray(v)));
1276
+ };
1277
+ matr_1.eigenvector = function (matr, maxIterations) {
1278
+ if (maxIterations === void 0) { maxIterations = 100; }
1279
+ var v = Chalkboard.matr.fill(1, Chalkboard.matr.rows(matr), 1);
1280
+ var _loop_2 = function (i) {
1281
+ var matrv = Chalkboard.matr.mul(matr, v);
1282
+ var max = Chalkboard.stat.max(Chalkboard.matr.toArray(Chalkboard.matr.absolute(matrv)));
1283
+ v = Chalkboard.stat.toMatrix(Chalkboard.matr.toArray(matrv).map(function (i) {
1284
+ return i / max;
1285
+ }), Chalkboard.matr.rows(matr), 1);
1286
+ };
1287
+ for (var i = 0; i < maxIterations; i++) {
1288
+ _loop_2(i);
1289
+ }
1290
+ var result = Chalkboard.matr.toArray(v);
1291
+ return result;
1292
+ };
1136
1293
  matr_1.empty = function (rows, cols) {
1137
1294
  if (cols === void 0) { cols = rows; }
1138
- var result = Chalkboard.matr.init();
1139
- for (var i = 0; i < rows; i++) {
1140
- result.push([]);
1141
- for (var j = 0; j < cols; j++) {
1142
- result[i].push(null);
1295
+ var _null = null;
1296
+ if (rows === 2 && cols === 2) {
1297
+ return Chalkboard.matr.init([_null, _null], [_null, _null]);
1298
+ }
1299
+ else if (rows === 3 && cols === 3) {
1300
+ return Chalkboard.matr.init([_null, _null, _null], [_null, _null, _null], [_null, _null, _null]);
1301
+ }
1302
+ else if (rows === 4 && cols === 4) {
1303
+ return Chalkboard.matr.init([_null, _null, _null, _null], [_null, _null, _null, _null], [_null, _null, _null, _null], [_null, _null, _null, _null]);
1304
+ }
1305
+ else {
1306
+ var result = Chalkboard.matr.init();
1307
+ for (var i = 0; i < rows; i++) {
1308
+ result.push([]);
1309
+ for (var j = 0; j < cols; j++) {
1310
+ result[i].push(_null);
1311
+ }
1143
1312
  }
1313
+ return result;
1144
1314
  }
1145
- return result;
1146
1315
  };
1147
1316
  matr_1.exchange = function (size) {
1148
- var result = Chalkboard.matr.fill(0, size, size);
1149
- for (var i = 0; i < size; i++) {
1150
- for (var j = 0; j < size; j++) {
1151
- if (i + j === size - 1) {
1152
- result[i][j] = 1;
1317
+ if (size === 2) {
1318
+ return Chalkboard.matr.init([0, 1], [1, 0]);
1319
+ }
1320
+ else if (size === 3) {
1321
+ return Chalkboard.matr.init([0, 0, 1], [0, 1, 0], [1, 0, 0]);
1322
+ }
1323
+ else if (size === 4) {
1324
+ return Chalkboard.matr.init([0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 0]);
1325
+ }
1326
+ else {
1327
+ var result = Chalkboard.matr.fill(0, size, size);
1328
+ for (var i = 0; i < size; i++) {
1329
+ for (var j = 0; j < size; j++) {
1330
+ if (i + j === size - 1) {
1331
+ result[i][j] = 1;
1332
+ }
1153
1333
  }
1154
1334
  }
1335
+ return result;
1155
1336
  }
1156
- return result;
1157
1337
  };
1158
1338
  matr_1.fill = function (element, rows, cols) {
1159
1339
  if (cols === void 0) { cols = rows; }
1160
- var result = Chalkboard.matr.init();
1161
- for (var i = 0; i < rows; i++) {
1162
- result.push([]);
1163
- for (var j = 0; j < cols; j++) {
1164
- result[i].push(element);
1340
+ if (rows === 2 && cols === 2) {
1341
+ return Chalkboard.matr.init([element, element], [element, element]);
1342
+ }
1343
+ else if (rows === 3 && cols === 3) {
1344
+ return Chalkboard.matr.init([element, element, element], [element, element, element], [element, element, element]);
1345
+ }
1346
+ else if (rows === 4 && cols === 4) {
1347
+ return Chalkboard.matr.init([element, element, element, element], [element, element, element, element], [element, element, element, element], [element, element, element, element]);
1348
+ }
1349
+ else {
1350
+ var result = Chalkboard.matr.init();
1351
+ for (var i = 0; i < rows; i++) {
1352
+ result.push([]);
1353
+ for (var j = 0; j < cols; j++) {
1354
+ result[i].push(element);
1355
+ }
1165
1356
  }
1357
+ return result;
1166
1358
  }
1167
- return result;
1359
+ };
1360
+ matr_1.Gaussian = function (matr) {
1361
+ var lead = 0;
1362
+ for (var row = 0; row < Chalkboard.matr.rows(matr); row++) {
1363
+ if (lead >= Chalkboard.matr.cols(matr)) {
1364
+ break;
1365
+ }
1366
+ var i = row;
1367
+ while (matr[i][lead] === 0) {
1368
+ i++;
1369
+ if (i === Chalkboard.matr.rows(matr)) {
1370
+ i = row;
1371
+ lead++;
1372
+ if (Chalkboard.matr.cols(matr) === lead) {
1373
+ return matr;
1374
+ }
1375
+ }
1376
+ }
1377
+ var temp = matr[i];
1378
+ matr[i] = matr[row];
1379
+ matr[row] = temp;
1380
+ var scl_1 = matr[row][lead];
1381
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1382
+ matr[row][j] /= scl_1;
1383
+ }
1384
+ for (var i_1 = 0; i_1 < Chalkboard.matr.rows(matr); i_1++) {
1385
+ if (i_1 !== row) {
1386
+ var coeff = matr[i_1][lead];
1387
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1388
+ matr[i_1][j] -= coeff * matr[row][j];
1389
+ }
1390
+ }
1391
+ }
1392
+ lead++;
1393
+ }
1394
+ return matr;
1168
1395
  };
1169
1396
  matr_1.Hilbert = function (size) {
1170
- var result = Chalkboard.matr.init();
1171
- for (var i = 0; i < size; i++) {
1172
- result.push([]);
1173
- for (var j = 0; j < size; j++) {
1174
- result[i].push(1 / (i + j + 1));
1397
+ if (size === 2) {
1398
+ return Chalkboard.matr.init([1 / 1, 1 / 2], [1 / 2, 1 / 3]);
1399
+ }
1400
+ else if (size === 3) {
1401
+ return Chalkboard.matr.init([1 / 1, 1 / 2, 1 / 3], [1 / 2, 1 / 3, 1 / 4], [1 / 3, 1 / 4, 1 / 5]);
1402
+ }
1403
+ else if (size === 4) {
1404
+ return Chalkboard.matr.init([1 / 1, 1 / 2, 1 / 3, 1 / 4], [1 / 2, 1 / 3, 1 / 4, 1 / 5], [1 / 3, 1 / 4, 1 / 5, 1 / 6], [1 / 4, 1 / 5, 1 / 6, 1 / 7]);
1405
+ }
1406
+ else {
1407
+ var result = Chalkboard.matr.init();
1408
+ for (var i = 0; i < size; i++) {
1409
+ result.push([]);
1410
+ for (var j = 0; j < size; j++) {
1411
+ result[i].push(1 / (i + j + 1));
1412
+ }
1175
1413
  }
1414
+ return result;
1176
1415
  }
1177
- return result;
1178
1416
  };
1179
1417
  matr_1.identity = function (size) {
1180
- var result = Chalkboard.matr.init();
1181
- for (var i = 0; i < size; i++) {
1182
- result.push(Array(size).fill(0));
1183
- result[i][i] = 1;
1418
+ if (size === 2) {
1419
+ return Chalkboard.matr.init([1, 0], [0, 1]);
1420
+ }
1421
+ else if (size === 3) {
1422
+ return Chalkboard.matr.init([1, 0, 0], [0, 1, 0], [0, 0, 1]);
1423
+ }
1424
+ else if (size === 4) {
1425
+ return Chalkboard.matr.init([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]);
1426
+ }
1427
+ else {
1428
+ var result = Chalkboard.matr.init();
1429
+ for (var i = 0; i < size; i++) {
1430
+ result.push(Array(size).fill(0));
1431
+ result[i][i] = 1;
1432
+ }
1433
+ return result;
1184
1434
  }
1185
- return result;
1186
1435
  };
1187
1436
  matr_1.init = function () {
1188
1437
  var matrix = [];
@@ -1200,60 +1449,379 @@ var Chalkboard;
1200
1449
  }
1201
1450
  };
1202
1451
  matr_1.invert = function (matr) {
1203
- if (Chalkboard.matr.rows(matr) === Chalkboard.matr.cols(matr)) {
1204
- var result = Chalkboard.matr.init();
1205
- var augmented = Chalkboard.matr.init();
1206
- for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1207
- augmented.push(matr[i].concat(Array(Chalkboard.matr.rows(matr)).fill(0)));
1208
- augmented[i][Chalkboard.matr.cols(matr) + i] = 1;
1209
- }
1210
- for (var row = 0; row < Chalkboard.matr.rows(matr); row++) {
1211
- var diagonal = augmented[row][row];
1212
- if (diagonal === 0) {
1213
- var max = row;
1214
- for (var i = row + 1; i < Chalkboard.matr.rows(matr); i++) {
1215
- if (Math.abs(augmented[i][row]) > Math.abs(augmented[max][row])) {
1216
- max = i;
1452
+ if (Chalkboard.matr.isInvertible(matr)) {
1453
+ if (Chalkboard.matr.rows(matr) === 2) {
1454
+ var det_1 = Chalkboard.matr.det(matr);
1455
+ return Chalkboard.matr.init([matr[1][1] / det_1, -matr[0][1] / det_1], [-matr[1][0] / det_1, matr[0][0] / det_1]);
1456
+ }
1457
+ else if (Chalkboard.matr.rows(matr) === 3) {
1458
+ var det_2 = Chalkboard.matr.det(matr);
1459
+ return Chalkboard.matr.init([
1460
+ (matr[1][1] * matr[2][2] - matr[1][2] * matr[2][1]) / det_2,
1461
+ (matr[0][2] * matr[2][1] - matr[0][1] * matr[2][2]) / det_2,
1462
+ (matr[0][1] * matr[1][2] - matr[0][2] * matr[1][1]) / det_2
1463
+ ], [
1464
+ (matr[1][2] * matr[2][0] - matr[1][0] * matr[2][2]) / det_2,
1465
+ (matr[0][0] * matr[2][2] - matr[0][2] * matr[2][0]) / det_2,
1466
+ (matr[0][2] * matr[1][0] - matr[0][0] * matr[1][2]) / det_2
1467
+ ], [
1468
+ (matr[1][0] * matr[2][1] - matr[1][1] * matr[2][0]) / det_2,
1469
+ (matr[0][1] * matr[2][0] - matr[0][0] * matr[2][1]) / det_2,
1470
+ (matr[0][0] * matr[1][1] - matr[0][1] * matr[1][0]) / det_2
1471
+ ]);
1472
+ }
1473
+ else if (Chalkboard.matr.rows(matr) === 4) {
1474
+ var det_3 = Chalkboard.matr.det(matr);
1475
+ var adj00 = matr[0][0] * matr[1][1] - matr[0][1] * matr[1][0], adj01 = matr[0][0] * matr[1][2] - matr[0][2] * matr[1][0], adj02 = matr[0][0] * matr[1][3] - matr[0][3] * matr[1][0], adj03 = matr[0][1] * matr[1][2] - matr[0][2] * matr[1][1], adj04 = matr[0][1] * matr[1][3] - matr[0][3] * matr[1][1], adj05 = matr[0][2] * matr[1][3] - matr[0][3] * matr[1][2], adj06 = matr[2][0] * matr[3][1] - matr[2][1] * matr[3][0], adj07 = matr[2][0] * matr[3][2] - matr[2][2] * matr[3][0], adj08 = matr[2][0] * matr[3][3] - matr[2][3] * matr[3][0], adj09 = matr[2][1] * matr[3][2] - matr[2][2] * matr[3][1], adj10 = matr[2][1] * matr[3][3] - matr[2][3] * matr[3][1], adj11 = matr[2][2] * matr[3][3] - matr[2][3] * matr[3][2];
1476
+ return Chalkboard.matr.init([
1477
+ (matr[1][1] * adj11 - matr[1][2] * adj10 + matr[1][3] * adj09) / det_3,
1478
+ (matr[0][2] * adj10 - matr[0][1] * adj11 - matr[0][3] * adj09) / det_3,
1479
+ (matr[3][1] * adj05 - matr[3][2] * adj04 + matr[3][3] * adj03) / det_3,
1480
+ (matr[2][2] * adj04 - matr[2][1] * adj05 - matr[2][3] * adj03) / det_3
1481
+ ], [
1482
+ (matr[1][2] * adj08 - matr[1][0] * adj11 - matr[1][3] * adj07) / det_3,
1483
+ (matr[0][0] * adj11 - matr[0][2] * adj08 + matr[0][3] * adj07) / det_3,
1484
+ (matr[3][2] * adj02 - matr[3][0] * adj05 - matr[3][3] * adj01) / det_3,
1485
+ (matr[2][0] * adj05 - matr[2][2] * adj02 + matr[2][3] * adj01) / det_3
1486
+ ], [
1487
+ (matr[1][0] * adj10 - matr[1][1] * adj08 + matr[1][3] * adj06) / det_3,
1488
+ (matr[0][1] * adj08 - matr[0][0] * adj10 - matr[0][3] * adj06) / det_3,
1489
+ (matr[3][0] * adj04 - matr[3][1] * adj02 + matr[3][3] * adj00) / det_3,
1490
+ (matr[2][1] * adj02 - matr[2][0] * adj04 - matr[2][3] * adj00) / det_3
1491
+ ], [
1492
+ (matr[1][1] * adj07 - matr[1][0] * adj09 - matr[1][2] * adj06) / det_3,
1493
+ (matr[0][0] * adj09 - matr[0][1] * adj07 + matr[0][2] * adj06) / det_3,
1494
+ (matr[3][1] * adj01 - matr[3][0] * adj03 - matr[3][2] * adj00) / det_3,
1495
+ (matr[2][0] * adj03 - matr[2][1] * adj01 + matr[2][2] * adj00) / det_3
1496
+ ]);
1497
+ }
1498
+ else {
1499
+ var result = Chalkboard.matr.init();
1500
+ var augmented = Chalkboard.matr.init();
1501
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1502
+ augmented.push(matr[i].concat(Array(Chalkboard.matr.rows(matr)).fill(0)));
1503
+ augmented[i][Chalkboard.matr.cols(matr) + i] = 1;
1504
+ }
1505
+ for (var row = 0; row < Chalkboard.matr.rows(matr); row++) {
1506
+ var diagonal_1 = augmented[row][row];
1507
+ if (diagonal_1 === 0) {
1508
+ var max = row;
1509
+ for (var i = row + 1; i < Chalkboard.matr.rows(matr); i++) {
1510
+ if (Math.abs(augmented[i][row]) > Math.abs(augmented[max][row])) {
1511
+ max = i;
1512
+ }
1513
+ }
1514
+ var temp = augmented[row];
1515
+ augmented[row] = augmented[max];
1516
+ augmented[max] = temp;
1517
+ diagonal_1 = augmented[row][row];
1518
+ }
1519
+ for (var col = 0; col < 2 * Chalkboard.matr.cols(matr); col++) {
1520
+ augmented[row][col] /= diagonal_1;
1521
+ }
1522
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1523
+ if (i !== row) {
1524
+ var coeff = augmented[i][row];
1525
+ for (var j = 0; j < 2 * Chalkboard.matr.cols(matr); j++) {
1526
+ augmented[i][j] -= coeff * augmented[row][j];
1527
+ }
1217
1528
  }
1218
1529
  }
1219
- var temp = augmented[row];
1220
- augmented[row] = augmented[max];
1221
- augmented[max] = temp;
1222
- diagonal = augmented[row][row];
1223
1530
  }
1224
- for (var col = 0; col < 2 * Chalkboard.matr.cols(matr); col++) {
1225
- augmented[row][col] /= diagonal;
1531
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1532
+ result.push(augmented[i].slice(Chalkboard.matr.cols(matr), 2 * Chalkboard.matr.cols(matr)));
1226
1533
  }
1534
+ return result;
1535
+ }
1536
+ }
1537
+ else {
1538
+ throw new TypeError('Parameter "matr" must be of type "ChalkboardMatrix" that is square and has a non-zero determinant.');
1539
+ }
1540
+ };
1541
+ matr_1.isDiagonal = function (matr) {
1542
+ if (Chalkboard.matr.isSquare(matr)) {
1543
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
1544
+ return matr[0][1] !== 0 && matr[1][0] !== 0;
1545
+ }
1546
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
1547
+ return matr[0][1] !== 0 && matr[0][2] !== 0 && matr[1][0] !== 0 && matr[1][2] !== 0 && matr[2][0] !== 0 && matr[2][1] !== 0;
1548
+ }
1549
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
1550
+ return (matr[0][1] !== 0 &&
1551
+ matr[0][2] !== 0 &&
1552
+ matr[0][3] !== 0 &&
1553
+ matr[1][0] !== 0 &&
1554
+ matr[1][2] !== 0 &&
1555
+ matr[1][3] !== 0 &&
1556
+ matr[2][0] !== 0 &&
1557
+ matr[2][1] !== 0 &&
1558
+ matr[2][3] !== 0 &&
1559
+ matr[3][0] !== 0 &&
1560
+ matr[3][1] !== 0 &&
1561
+ matr[3][2] !== 0);
1562
+ }
1563
+ else {
1564
+ var score = 0;
1227
1565
  for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1228
- if (i !== row) {
1229
- var coeff = augmented[i][row];
1230
- for (var j = 0; j < 2 * Chalkboard.matr.cols(matr); j++) {
1231
- augmented[i][j] -= coeff * augmented[row][j];
1232
- }
1566
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1567
+ if (i !== j && matr[i][j] !== 0)
1568
+ score++;
1233
1569
  }
1234
1570
  }
1571
+ return score === 0;
1572
+ }
1573
+ }
1574
+ else {
1575
+ return false;
1576
+ }
1577
+ };
1578
+ matr_1.isEqual = function (matr1, matr2) {
1579
+ if (Chalkboard.matr.isSizeEqual(matr1, matr2)) {
1580
+ if (Chalkboard.matr.isSizeOf(matr1, 2)) {
1581
+ return matr1[0][0] === matr2[0][0] && matr1[0][1] === matr2[0][1] && matr1[1][0] === matr2[1][0] && matr1[1][1] === matr2[1][1];
1582
+ }
1583
+ else if (Chalkboard.matr.isSizeOf(matr1, 3)) {
1584
+ return (matr1[0][0] === matr2[0][0] &&
1585
+ matr1[0][1] === matr2[0][1] &&
1586
+ matr1[0][2] === matr2[0][2] &&
1587
+ matr1[1][0] === matr2[1][0] &&
1588
+ matr1[1][1] === matr2[1][1] &&
1589
+ matr1[1][2] === matr2[1][2] &&
1590
+ matr1[2][0] === matr2[2][0] &&
1591
+ matr1[2][1] === matr2[2][1] &&
1592
+ matr1[2][2] === matr2[2][2]);
1593
+ }
1594
+ else if (Chalkboard.matr.isSizeOf(matr1, 4)) {
1595
+ return (matr1[0][0] === matr2[0][0] &&
1596
+ matr1[0][1] === matr2[0][1] &&
1597
+ matr1[0][2] === matr2[0][2] &&
1598
+ matr1[0][3] === matr2[0][3] &&
1599
+ matr1[1][0] === matr2[1][0] &&
1600
+ matr1[1][1] === matr2[1][1] &&
1601
+ matr1[1][2] === matr2[1][2] &&
1602
+ matr1[1][3] === matr2[1][3] &&
1603
+ matr1[2][0] === matr2[2][0] &&
1604
+ matr1[2][1] === matr2[2][1] &&
1605
+ matr1[2][2] === matr2[2][2] &&
1606
+ matr1[2][3] === matr2[2][3] &&
1607
+ matr1[3][0] === matr2[3][0] &&
1608
+ matr1[3][1] === matr2[3][1] &&
1609
+ matr1[3][2] === matr2[3][2] &&
1610
+ matr1[3][3] === matr2[3][3]);
1235
1611
  }
1236
- for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1237
- result.push(augmented[i].slice(Chalkboard.matr.cols(matr), 2 * Chalkboard.matr.cols(matr)));
1612
+ else {
1613
+ var score = Chalkboard.matr.rows(matr1) * Chalkboard.matr.cols(matr2);
1614
+ for (var i = 0; i < Chalkboard.matr.rows(matr1); i++) {
1615
+ for (var j = 0; j < Chalkboard.matr.cols(matr2); j++) {
1616
+ if (matr1[i][j] === matr2[i][j])
1617
+ score--;
1618
+ }
1619
+ }
1620
+ return score === 0;
1238
1621
  }
1239
- return result;
1240
1622
  }
1241
1623
  else {
1242
- throw new TypeError('Parameter "matr" must be of type "ChalkboardMatrix" that is square.');
1624
+ return false;
1243
1625
  }
1244
1626
  };
1627
+ matr_1.isIdentity = function (matr) {
1628
+ if (Chalkboard.matr.isDiagonal(matr)) {
1629
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
1630
+ return matr[0][0] === 1 && matr[1][1] === 1;
1631
+ }
1632
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
1633
+ return matr[0][0] === 1 && matr[1][1] === 1 && matr[2][2] === 1;
1634
+ }
1635
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
1636
+ return matr[0][0] === 1 && matr[1][1] === 1 && matr[2][2] === 1 && matr[3][3] === 1;
1637
+ }
1638
+ else {
1639
+ var score = 0;
1640
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1641
+ if (matr[i][i] !== 1)
1642
+ score++;
1643
+ }
1644
+ return score === 0;
1645
+ }
1646
+ }
1647
+ else {
1648
+ return false;
1649
+ }
1650
+ };
1651
+ matr_1.isInvertible = function (matr) {
1652
+ return Chalkboard.matr.isSquare(matr) && Chalkboard.matr.det(matr) !== 0;
1653
+ };
1654
+ matr_1.isLowerTriangular = function (matr) {
1655
+ if (Chalkboard.matr.isSquare(matr)) {
1656
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
1657
+ return matr[0][1] === 0;
1658
+ }
1659
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
1660
+ return matr[0][1] === 0 && matr[0][2] === 0 && matr[1][2] === 0;
1661
+ }
1662
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
1663
+ return matr[0][1] === 0 && matr[0][2] === 0 && matr[0][3] === 0 && matr[1][2] === 0 && matr[1][3] === 0 && matr[2][3] === 0;
1664
+ }
1665
+ else {
1666
+ var score = 0;
1667
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1668
+ for (var j = i + 1; j < Chalkboard.matr.cols(matr); j++) {
1669
+ if (matr[i][j] !== 0)
1670
+ score++;
1671
+ }
1672
+ }
1673
+ return score === 0;
1674
+ }
1675
+ }
1676
+ else {
1677
+ return false;
1678
+ }
1679
+ };
1680
+ matr_1.isOrthogonal = function (matr) {
1681
+ if (Chalkboard.matr.isInvertible(matr)) {
1682
+ return Chalkboard.matr.isEqual(Chalkboard.matr.transpose(matr), Chalkboard.matr.invert(matr));
1683
+ }
1684
+ else {
1685
+ return false;
1686
+ }
1687
+ };
1688
+ matr_1.isSizeEqual = function (matr1, matr2) {
1689
+ return Chalkboard.matr.rows(matr1) === Chalkboard.matr.rows(matr2) && Chalkboard.matr.cols(matr1) === Chalkboard.matr.cols(matr2);
1690
+ };
1691
+ matr_1.isSizeOf = function (matr, rows, cols) {
1692
+ if (cols === void 0) { cols = rows; }
1693
+ return Chalkboard.matr.rows(matr) === rows && Chalkboard.matr.cols(matr) === cols;
1694
+ };
1695
+ matr_1.isSkewSymmetric = function (matr) {
1696
+ return Chalkboard.matr.isEqual(Chalkboard.matr.transpose(matr), Chalkboard.matr.negate(matr));
1697
+ };
1698
+ matr_1.isSquare = function (matr) {
1699
+ return Chalkboard.matr.rows(matr) === Chalkboard.matr.cols(matr);
1700
+ };
1701
+ matr_1.isSymmetric = function (matr) {
1702
+ return Chalkboard.matr.isEqual(matr, Chalkboard.matr.transpose(matr));
1703
+ };
1704
+ matr_1.isUpperTriangular = function (matr) {
1705
+ if (Chalkboard.matr.isSquare(matr)) {
1706
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
1707
+ return matr[1][0] === 0;
1708
+ }
1709
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
1710
+ return matr[1][0] === 0 && matr[2][0] === 0 && matr[2][1] === 0;
1711
+ }
1712
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
1713
+ return matr[1][0] === 0 && matr[2][0] === 0 && matr[2][1] === 0 && matr[3][0] === 0 && matr[3][1] === 0 && matr[3][2] === 0;
1714
+ }
1715
+ else {
1716
+ var score = 0;
1717
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1718
+ for (var j = 0; j < i; j++) {
1719
+ if (matr[i][j] !== 0)
1720
+ score++;
1721
+ }
1722
+ }
1723
+ return score === 0;
1724
+ }
1725
+ }
1726
+ else {
1727
+ return false;
1728
+ }
1729
+ };
1730
+ matr_1.isZero = function (matr) {
1731
+ return Chalkboard.matr.isEqual(matr, Chalkboard.matr.zero(matr));
1732
+ };
1245
1733
  matr_1.Lehmer = function (size) {
1246
- var result = Chalkboard.matr.init();
1247
- for (var i = 0; i < size; i++) {
1248
- result.push([]);
1249
- for (var j = 0; j < size; j++) {
1250
- result[i].push(Math.min(i + 1, j + 1) / Math.max(i + 1, j + 1));
1734
+ if (size === 2) {
1735
+ return Chalkboard.matr.init([1 / 1, 1 / 2], [1 / 2, 1 / 1]);
1736
+ }
1737
+ else if (size === 3) {
1738
+ return Chalkboard.matr.init([1 / 1, 1 / 2, 1 / 3], [1 / 2, 1 / 1, 2 / 3], [1 / 3, 2 / 3, 1 / 1]);
1739
+ }
1740
+ else if (size === 4) {
1741
+ return Chalkboard.matr.init([1 / 1, 1 / 2, 1 / 3, 1 / 4], [1 / 2, 1 / 1, 2 / 3, 1 / 2], [1 / 3, 2 / 3, 1 / 1, 3 / 4], [1 / 4, 1 / 1, 3 / 4, 1 / 1]);
1742
+ }
1743
+ else {
1744
+ var result = Chalkboard.matr.init();
1745
+ for (var i = 0; i < size; i++) {
1746
+ result.push([]);
1747
+ for (var j = 0; j < size; j++) {
1748
+ result[i].push(Math.min(i + 1, j + 1) / Math.max(i + 1, j + 1));
1749
+ }
1251
1750
  }
1751
+ return result;
1752
+ }
1753
+ };
1754
+ matr_1.lowerBinomial = function (size) {
1755
+ if (size === 2) {
1756
+ return Chalkboard.matr.init([1, 0], [1, 1]);
1757
+ }
1758
+ else if (size === 3) {
1759
+ return Chalkboard.matr.init([1, 0, 0], [1, 1, 0], [1, 2, 1]);
1760
+ }
1761
+ else if (size === 4) {
1762
+ return Chalkboard.matr.init([1, 0, 0, 0], [1, 1, 0, 0], [1, 2, 1, 0], [1, 3, 3, 1]);
1763
+ }
1764
+ else {
1765
+ var result = Chalkboard.matr.init();
1766
+ for (var i = 0; i < size; i++) {
1767
+ result.push([]);
1768
+ for (var j = 0; j < size; j++) {
1769
+ result[i].push(Chalkboard.numb.binomial(i, j));
1770
+ }
1771
+ }
1772
+ return result;
1773
+ }
1774
+ };
1775
+ matr_1.lowerShift = function (size) {
1776
+ if (size === 2) {
1777
+ return Chalkboard.matr.init([0, 0], [1, 0]);
1778
+ }
1779
+ else if (size === 3) {
1780
+ return Chalkboard.matr.init([0, 0, 0], [1, 0, 0], [0, 1, 0]);
1781
+ }
1782
+ else if (size === 4) {
1783
+ return Chalkboard.matr.init([0, 0, 0, 0], [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]);
1784
+ }
1785
+ else {
1786
+ var result = Chalkboard.matr.init();
1787
+ for (var i = 0; i < size; i++) {
1788
+ result[i] = [];
1789
+ for (var j = 0; j < size; j++) {
1790
+ result[i][j] = Chalkboard.numb.Kronecker(i, j + 1);
1791
+ }
1792
+ }
1793
+ return result;
1794
+ }
1795
+ };
1796
+ matr_1.lowerTriangular = function (size) {
1797
+ var elements = [];
1798
+ for (var _i = 1; _i < arguments.length; _i++) {
1799
+ elements[_i - 1] = arguments[_i];
1800
+ }
1801
+ if (size === 2) {
1802
+ return Chalkboard.matr.init([elements[0] || 0, 0], [elements[1] || 0, elements[2] || 0]);
1803
+ }
1804
+ else if (size === 3) {
1805
+ return Chalkboard.matr.init([elements[0] || 0, 0, 0], [elements[1] || 0, elements[2] || 0, 0], [elements[3] || 0, elements[4] || 0, elements[5] || 0]);
1806
+ }
1807
+ else if (size === 4) {
1808
+ return Chalkboard.matr.init([elements[0] || 0, 0, 0, 0], [elements[1] || 0, elements[2] || 0, 0, 0], [elements[3] || 0, elements[4] || 0, elements[5] || 0, 0], [elements[6] || 0, elements[7] || 0, elements[8] || 0, elements[9] || 0]);
1809
+ }
1810
+ else {
1811
+ elements = Array.isArray(elements[0]) ? elements[0] : elements;
1812
+ var result = Chalkboard.matr.init();
1813
+ var index = 0;
1814
+ for (var i = 0; i < size; i++) {
1815
+ result[i] = [];
1816
+ for (var j = 0; j < size; j++) {
1817
+ result[i][j] = j <= i ? elements[index++] || 0 : 0;
1818
+ }
1819
+ }
1820
+ return result;
1252
1821
  }
1253
- return result;
1254
1822
  };
1255
1823
  matr_1.LUdecomp = function (matr) {
1256
- if (Chalkboard.matr.rows(matr) === Chalkboard.matr.cols(matr)) {
1824
+ if (Chalkboard.matr.isSquare(matr)) {
1257
1825
  var L = Chalkboard.matr.identity(Chalkboard.matr.rows(matr)), U = Chalkboard.matr.fill(0, Chalkboard.matr.rows(matr));
1258
1826
  for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1259
1827
  for (var i = 0; i <= j; i++) {
@@ -1279,40 +1847,465 @@ var Chalkboard;
1279
1847
  };
1280
1848
  matr_1.mul = function (matr1, matr2) {
1281
1849
  if (Chalkboard.matr.cols(matr1) === Chalkboard.matr.rows(matr2)) {
1282
- var result = Chalkboard.matr.init();
1283
- for (var i = 0; i < Chalkboard.matr.rows(matr1); i++) {
1284
- result[i] = [];
1285
- for (var j = 0; j < Chalkboard.matr.cols(matr2); j++) {
1286
- result[i][j] = 0;
1287
- for (var k = 0; k < Chalkboard.matr.cols(matr1); k++) {
1288
- result[i][j] += matr1[i][k] * matr2[k][j];
1850
+ if (Chalkboard.matr.isSizeOf(matr1, 2) && Chalkboard.matr.isSizeOf(matr2, 2, 1)) {
1851
+ return Chalkboard.matr.init([matr1[0][0] * matr2[0][0] + matr1[0][1] * matr2[1][0]], [matr1[1][0] * matr2[0][0] + matr1[1][1] * matr2[1][0]]);
1852
+ }
1853
+ else if (Chalkboard.matr.isSizeOf(matr1, 2) && Chalkboard.matr.isSizeOf(matr2, 2)) {
1854
+ return Chalkboard.matr.init([matr1[0][0] * matr2[0][0] + matr1[0][1] * matr2[1][0], matr1[0][0] * matr2[0][1] + matr1[0][1] * matr2[1][1]], [matr1[1][0] * matr2[0][0] + matr1[1][1] * matr2[1][0], matr1[1][0] * matr2[0][1] + matr1[1][1] * matr2[1][1]]);
1855
+ }
1856
+ else if (Chalkboard.matr.isSizeOf(matr1, 3) && Chalkboard.matr.isSizeOf(matr2, 3, 1)) {
1857
+ return Chalkboard.matr.init([matr1[0][0] * matr2[0][0] + matr1[0][1] * matr2[1][0] + matr1[0][2] * matr2[2][0]], [matr1[1][0] * matr2[0][0] + matr1[1][1] * matr2[1][0] + matr1[1][2] * matr2[2][0]], [matr1[2][0] * matr2[0][0] + matr1[2][1] * matr2[1][0] + matr1[2][2] * matr2[2][0]]);
1858
+ }
1859
+ else if (Chalkboard.matr.isSizeOf(matr1, 3) && Chalkboard.matr.isSizeOf(matr2, 3)) {
1860
+ return Chalkboard.matr.init([
1861
+ matr1[0][0] * matr2[0][0] + matr1[0][1] * matr2[1][0] + matr1[0][2] * matr2[2][0],
1862
+ matr1[0][0] * matr2[0][1] + matr1[0][1] * matr2[1][1] + matr1[0][2] * matr2[2][1],
1863
+ matr1[0][0] * matr2[0][2] + matr1[0][1] * matr2[1][2] + matr1[0][2] * matr2[2][2]
1864
+ ], [
1865
+ matr1[1][0] * matr2[0][0] + matr1[1][1] * matr2[1][0] + matr1[1][2] * matr2[2][0],
1866
+ matr1[1][0] * matr2[0][1] + matr1[1][1] * matr2[1][1] + matr1[1][2] * matr2[2][1],
1867
+ matr1[1][0] * matr2[0][2] + matr1[1][1] * matr2[1][2] + matr1[1][2] * matr2[2][2]
1868
+ ], [
1869
+ matr1[2][0] * matr2[0][0] + matr1[2][1] * matr2[1][0] + matr1[2][2] * matr2[2][0],
1870
+ matr1[2][0] * matr2[0][1] + matr1[2][1] * matr2[1][1] + matr1[2][2] * matr2[2][1],
1871
+ matr1[2][0] * matr2[0][2] + matr1[2][1] * matr2[1][2] + matr1[2][2] * matr2[2][2]
1872
+ ]);
1873
+ }
1874
+ else if (Chalkboard.matr.isSizeOf(matr1, 4) && Chalkboard.matr.isSizeOf(matr2, 4, 1)) {
1875
+ return Chalkboard.matr.init([matr1[0][0] * matr2[0][0] + matr1[0][1] * matr2[1][0] + matr1[0][2] * matr2[2][0] + matr1[0][3] * matr2[3][0]], [matr1[1][0] * matr2[0][0] + matr1[1][1] * matr2[1][0] + matr1[1][2] * matr2[2][0] + matr1[1][3] * matr2[3][0]], [matr1[2][0] * matr2[0][0] + matr1[2][1] * matr2[1][0] + matr1[2][2] * matr2[2][0] + matr1[2][3] * matr2[3][0]], [matr1[3][0] * matr2[0][0] + matr1[3][1] * matr2[1][0] + matr1[3][2] * matr2[2][0] + matr1[3][3] * matr2[3][0]]);
1876
+ }
1877
+ else if (Chalkboard.matr.isSizeOf(matr1, 4) && Chalkboard.matr.isSizeOf(matr2, 4)) {
1878
+ return Chalkboard.matr.init([
1879
+ matr1[0][0] * matr2[0][0] + matr1[0][1] * matr2[1][0] + matr1[0][2] * matr2[2][0] + matr1[0][3] * matr2[3][0],
1880
+ matr1[0][0] * matr2[0][1] + matr1[0][1] * matr2[1][1] + matr1[0][2] * matr2[2][1] + matr1[0][3] * matr2[3][1],
1881
+ matr1[0][0] * matr2[0][2] + matr1[0][1] * matr2[1][2] + matr1[0][2] * matr2[2][2] + matr1[0][3] * matr2[3][2],
1882
+ matr1[0][0] * matr2[0][3] + matr1[0][1] * matr2[1][3] + matr1[0][2] * matr2[2][3] + matr1[0][3] * matr2[3][3]
1883
+ ], [
1884
+ matr1[1][0] * matr2[0][0] + matr1[1][1] * matr2[1][0] + matr1[1][2] * matr2[2][0] + matr1[1][3] * matr2[3][0],
1885
+ matr1[1][0] * matr2[0][1] + matr1[1][1] * matr2[1][1] + matr1[1][2] * matr2[2][1] + matr1[1][3] * matr2[3][1],
1886
+ matr1[1][0] * matr2[0][2] + matr1[1][1] * matr2[1][2] + matr1[1][2] * matr2[2][2] + matr1[1][3] * matr2[3][2],
1887
+ matr1[1][0] * matr2[0][3] + matr1[1][1] * matr2[1][3] + matr1[1][2] * matr2[2][3] + matr1[1][3] * matr2[3][3]
1888
+ ], [
1889
+ matr1[2][0] * matr2[0][0] + matr1[2][1] * matr2[1][0] + matr1[2][2] * matr2[2][0] + matr1[2][3] * matr2[3][0],
1890
+ matr1[2][0] * matr2[0][1] + matr1[2][1] * matr2[1][1] + matr1[2][2] * matr2[2][1] + matr1[2][3] * matr2[3][1],
1891
+ matr1[2][0] * matr2[0][2] + matr1[2][1] * matr2[1][2] + matr1[2][2] * matr2[2][2] + matr1[2][3] * matr2[3][2],
1892
+ matr1[2][0] * matr2[0][3] + matr1[2][1] * matr2[1][3] + matr1[2][2] * matr2[2][3] + matr1[2][3] * matr2[3][3]
1893
+ ], [
1894
+ matr1[3][0] * matr2[0][0] + matr1[3][1] * matr2[1][0] + matr1[3][2] * matr2[2][0] + matr1[3][3] * matr2[3][0],
1895
+ matr1[3][0] * matr2[0][1] + matr1[3][1] * matr2[1][1] + matr1[3][2] * matr2[2][1] + matr1[3][3] * matr2[3][1],
1896
+ matr1[3][0] * matr2[0][2] + matr1[3][1] * matr2[1][2] + matr1[3][2] * matr2[2][2] + matr1[3][3] * matr2[3][2],
1897
+ matr1[3][0] * matr2[0][3] + matr1[3][1] * matr2[1][3] + matr1[3][2] * matr2[2][3] + matr1[3][3] * matr2[3][3]
1898
+ ]);
1899
+ }
1900
+ else {
1901
+ var result = Chalkboard.matr.init();
1902
+ for (var i = 0; i < Chalkboard.matr.rows(matr1); i++) {
1903
+ result[i] = [];
1904
+ for (var j = 0; j < Chalkboard.matr.cols(matr2); j++) {
1905
+ result[i][j] = 0;
1906
+ for (var k = 0; k < Chalkboard.matr.cols(matr1); k++) {
1907
+ result[i][j] += matr1[i][k] * matr2[k][j];
1908
+ }
1289
1909
  }
1290
1910
  }
1911
+ return result;
1291
1912
  }
1292
- return result;
1293
1913
  }
1294
1914
  else {
1295
1915
  throw new TypeError('Parameters "matr1" and "matr2" must be of type "ChalkboardMatrix" where the numbers of columns of "matr1" must be equivalent to the number of rows of "matr2".');
1296
1916
  }
1297
1917
  };
1298
1918
  matr_1.mulKronecker = function (matr1, matr2) {
1299
- var result = Chalkboard.matr.init();
1300
- for (var i = 0; i < Chalkboard.matr.rows(matr1); i++) {
1301
- for (var j = 0; j < Chalkboard.matr.cols(matr1); j++) {
1302
- for (var k = 0; k < Chalkboard.matr.rows(matr2); k++) {
1303
- for (var l = 0; l < Chalkboard.matr.cols(matr2); l++) {
1304
- if (!result[i * Chalkboard.matr.rows(matr2) + k]) {
1305
- result[i * Chalkboard.matr.rows(matr2) + k] = [];
1919
+ if (Chalkboard.matr.isSizeOf(matr1, 2) && Chalkboard.matr.isSizeOf(matr2, 2)) {
1920
+ return Chalkboard.matr.init([matr1[0][0] * matr2[0][0], matr1[0][0] * matr2[0][1], matr1[0][1] * matr2[0][0], matr1[0][1] * matr2[0][1]], [matr1[0][0] * matr2[1][0], matr1[0][0] * matr2[1][1], matr1[0][1] * matr2[1][0], matr1[0][1] * matr2[1][1]], [matr1[1][0] * matr2[0][0], matr1[1][0] * matr2[0][1], matr1[1][1] * matr2[0][0], matr1[1][1] * matr2[0][1]], [matr1[1][0] * matr2[1][0], matr1[1][0] * matr2[1][1], matr1[1][1] * matr2[1][0], matr1[1][1] * matr2[1][1]]);
1921
+ }
1922
+ else if (Chalkboard.matr.isSizeOf(matr1, 3) && Chalkboard.matr.isSizeOf(matr2, 3)) {
1923
+ return Chalkboard.matr.init([
1924
+ matr1[0][0] * matr2[0][0],
1925
+ matr1[0][0] * matr2[0][1],
1926
+ matr1[0][0] * matr2[0][2],
1927
+ matr1[0][1] * matr2[0][0],
1928
+ matr1[0][1] * matr2[0][1],
1929
+ matr1[0][1] * matr2[0][2],
1930
+ matr1[0][2] * matr2[0][0],
1931
+ matr1[0][2] * matr2[0][1],
1932
+ matr1[0][2] * matr2[0][2]
1933
+ ], [
1934
+ matr1[0][0] * matr2[1][0],
1935
+ matr1[0][0] * matr2[1][1],
1936
+ matr1[0][0] * matr2[1][2],
1937
+ matr1[0][1] * matr2[1][0],
1938
+ matr1[0][1] * matr2[1][1],
1939
+ matr1[0][1] * matr2[1][2],
1940
+ matr1[0][2] * matr2[1][0],
1941
+ matr1[0][2] * matr2[1][1],
1942
+ matr1[0][2] * matr2[1][2]
1943
+ ], [
1944
+ matr1[0][0] * matr2[2][0],
1945
+ matr1[0][0] * matr2[2][1],
1946
+ matr1[0][0] * matr2[2][2],
1947
+ matr1[0][1] * matr2[2][0],
1948
+ matr1[0][1] * matr2[2][1],
1949
+ matr1[0][1] * matr2[2][2],
1950
+ matr1[0][2] * matr2[2][0],
1951
+ matr1[0][2] * matr2[2][1],
1952
+ matr1[0][2] * matr2[2][2]
1953
+ ], [
1954
+ matr1[1][0] * matr2[0][0],
1955
+ matr1[1][0] * matr2[0][1],
1956
+ matr1[1][0] * matr2[0][2],
1957
+ matr1[1][1] * matr2[0][0],
1958
+ matr1[1][1] * matr2[0][1],
1959
+ matr1[1][1] * matr2[0][2],
1960
+ matr1[1][2] * matr2[0][0],
1961
+ matr1[1][2] * matr2[0][1],
1962
+ matr1[1][2] * matr2[0][2]
1963
+ ], [
1964
+ matr1[1][0] * matr2[1][0],
1965
+ matr1[1][0] * matr2[1][1],
1966
+ matr1[1][0] * matr2[1][2],
1967
+ matr1[1][1] * matr2[1][0],
1968
+ matr1[1][1] * matr2[1][1],
1969
+ matr1[1][1] * matr2[1][2],
1970
+ matr1[1][2] * matr2[1][0],
1971
+ matr1[1][2] * matr2[1][1],
1972
+ matr1[1][2] * matr2[1][2]
1973
+ ], [
1974
+ matr1[1][0] * matr2[2][0],
1975
+ matr1[1][0] * matr2[2][1],
1976
+ matr1[1][0] * matr2[2][2],
1977
+ matr1[1][1] * matr2[2][0],
1978
+ matr1[1][1] * matr2[2][1],
1979
+ matr1[1][1] * matr2[2][2],
1980
+ matr1[1][2] * matr2[2][0],
1981
+ matr1[1][2] * matr2[2][1],
1982
+ matr1[1][2] * matr2[2][2]
1983
+ ], [
1984
+ matr1[2][0] * matr2[0][0],
1985
+ matr1[2][0] * matr2[0][1],
1986
+ matr1[2][0] * matr2[0][2],
1987
+ matr1[2][1] * matr2[0][0],
1988
+ matr1[2][1] * matr2[0][1],
1989
+ matr1[2][1] * matr2[0][2],
1990
+ matr1[2][2] * matr2[0][0],
1991
+ matr1[2][2] * matr2[0][1],
1992
+ matr1[2][2] * matr2[0][2]
1993
+ ], [
1994
+ matr1[2][0] * matr2[1][0],
1995
+ matr1[2][0] * matr2[1][1],
1996
+ matr1[2][0] * matr2[1][2],
1997
+ matr1[2][1] * matr2[1][0],
1998
+ matr1[2][1] * matr2[1][1],
1999
+ matr1[2][1] * matr2[1][2],
2000
+ matr1[2][2] * matr2[1][0],
2001
+ matr1[2][2] * matr2[1][1],
2002
+ matr1[2][2] * matr2[1][2]
2003
+ ], [
2004
+ matr1[2][0] * matr2[2][0],
2005
+ matr1[2][0] * matr2[2][1],
2006
+ matr1[2][0] * matr2[2][2],
2007
+ matr1[2][1] * matr2[2][0],
2008
+ matr1[2][1] * matr2[2][1],
2009
+ matr1[2][1] * matr2[2][2],
2010
+ matr1[2][2] * matr2[2][0],
2011
+ matr1[2][2] * matr2[2][1],
2012
+ matr1[2][2] * matr2[2][2]
2013
+ ]);
2014
+ }
2015
+ else if (Chalkboard.matr.isSizeOf(matr1, 4) && Chalkboard.matr.isSizeOf(matr2, 4)) {
2016
+ return Chalkboard.matr.init([
2017
+ matr1[0][0] * matr2[0][0],
2018
+ matr1[0][0] * matr2[0][1],
2019
+ matr1[0][0] * matr2[0][2],
2020
+ matr1[0][0] * matr2[0][3],
2021
+ matr1[0][1] * matr2[0][0],
2022
+ matr1[0][1] * matr2[0][1],
2023
+ matr1[0][1] * matr2[0][2],
2024
+ matr1[0][1] * matr2[0][3],
2025
+ matr1[0][2] * matr2[0][0],
2026
+ matr1[0][2] * matr2[0][1],
2027
+ matr1[0][2] * matr2[0][2],
2028
+ matr1[0][2] * matr2[0][3],
2029
+ matr1[0][3] * matr2[0][0],
2030
+ matr1[0][3] * matr2[0][1],
2031
+ matr1[0][3] * matr2[0][2],
2032
+ matr1[0][3] * matr2[0][3]
2033
+ ], [
2034
+ matr1[0][0] * matr2[1][0],
2035
+ matr1[0][0] * matr2[1][1],
2036
+ matr1[0][0] * matr2[1][2],
2037
+ matr1[0][0] * matr2[1][3],
2038
+ matr1[0][1] * matr2[1][0],
2039
+ matr1[0][1] * matr2[1][1],
2040
+ matr1[0][1] * matr2[1][2],
2041
+ matr1[0][1] * matr2[1][3],
2042
+ matr1[0][2] * matr2[1][0],
2043
+ matr1[0][2] * matr2[1][1],
2044
+ matr1[0][2] * matr2[1][2],
2045
+ matr1[0][2] * matr2[1][3],
2046
+ matr1[0][3] * matr2[1][0],
2047
+ matr1[0][3] * matr2[1][1],
2048
+ matr1[0][3] * matr2[1][2],
2049
+ matr1[0][3] * matr2[1][3]
2050
+ ], [
2051
+ matr1[0][0] * matr2[2][0],
2052
+ matr1[0][0] * matr2[2][1],
2053
+ matr1[0][0] * matr2[2][2],
2054
+ matr1[0][0] * matr2[2][3],
2055
+ matr1[0][1] * matr2[2][0],
2056
+ matr1[0][1] * matr2[2][1],
2057
+ matr1[0][1] * matr2[2][2],
2058
+ matr1[0][1] * matr2[2][3],
2059
+ matr1[0][2] * matr2[2][0],
2060
+ matr1[0][2] * matr2[2][1],
2061
+ matr1[0][2] * matr2[2][2],
2062
+ matr1[0][2] * matr2[2][3],
2063
+ matr1[0][3] * matr2[2][0],
2064
+ matr1[0][3] * matr2[2][1],
2065
+ matr1[0][3] * matr2[2][2],
2066
+ matr1[0][3] * matr2[2][3]
2067
+ ], [
2068
+ matr1[0][0] * matr2[3][0],
2069
+ matr1[0][0] * matr2[3][1],
2070
+ matr1[0][0] * matr2[3][2],
2071
+ matr1[0][0] * matr2[3][3],
2072
+ matr1[0][1] * matr2[3][0],
2073
+ matr1[0][1] * matr2[3][1],
2074
+ matr1[0][1] * matr2[3][2],
2075
+ matr1[0][1] * matr2[3][3],
2076
+ matr1[0][2] * matr2[3][0],
2077
+ matr1[0][2] * matr2[3][1],
2078
+ matr1[0][2] * matr2[3][2],
2079
+ matr1[0][2] * matr2[3][3],
2080
+ matr1[0][3] * matr2[3][0],
2081
+ matr1[0][3] * matr2[3][1],
2082
+ matr1[0][3] * matr2[3][2],
2083
+ matr1[0][3] * matr2[3][3]
2084
+ ], [
2085
+ matr1[1][0] * matr2[0][0],
2086
+ matr1[1][0] * matr2[0][1],
2087
+ matr1[1][0] * matr2[0][2],
2088
+ matr1[1][0] * matr2[0][3],
2089
+ matr1[1][1] * matr2[0][0],
2090
+ matr1[1][1] * matr2[0][1],
2091
+ matr1[1][1] * matr2[0][2],
2092
+ matr1[1][1] * matr2[0][3],
2093
+ matr1[1][2] * matr2[0][0],
2094
+ matr1[1][2] * matr2[0][1],
2095
+ matr1[1][2] * matr2[0][2],
2096
+ matr1[1][2] * matr2[0][3],
2097
+ matr1[1][3] * matr2[0][0],
2098
+ matr1[1][3] * matr2[0][1],
2099
+ matr1[1][3] * matr2[0][2],
2100
+ matr1[1][3] * matr2[0][3]
2101
+ ], [
2102
+ matr1[1][0] * matr2[1][0],
2103
+ matr1[1][0] * matr2[1][1],
2104
+ matr1[1][0] * matr2[1][2],
2105
+ matr1[1][0] * matr2[1][3],
2106
+ matr1[1][1] * matr2[1][0],
2107
+ matr1[1][1] * matr2[1][1],
2108
+ matr1[1][1] * matr2[1][2],
2109
+ matr1[1][1] * matr2[1][3],
2110
+ matr1[1][2] * matr2[1][0],
2111
+ matr1[1][2] * matr2[1][1],
2112
+ matr1[1][2] * matr2[1][2],
2113
+ matr1[1][2] * matr2[1][3],
2114
+ matr1[1][3] * matr2[1][0],
2115
+ matr1[1][3] * matr2[1][1],
2116
+ matr1[1][3] * matr2[1][2],
2117
+ matr1[1][3] * matr2[1][3]
2118
+ ], [
2119
+ matr1[1][0] * matr2[2][0],
2120
+ matr1[1][0] * matr2[2][1],
2121
+ matr1[1][0] * matr2[2][2],
2122
+ matr1[1][0] * matr2[2][3],
2123
+ matr1[1][1] * matr2[2][0],
2124
+ matr1[1][1] * matr2[2][1],
2125
+ matr1[1][1] * matr2[2][2],
2126
+ matr1[1][1] * matr2[2][3],
2127
+ matr1[1][2] * matr2[2][0],
2128
+ matr1[1][2] * matr2[2][1],
2129
+ matr1[1][2] * matr2[2][2],
2130
+ matr1[1][2] * matr2[2][3],
2131
+ matr1[1][3] * matr2[2][0],
2132
+ matr1[1][3] * matr2[2][1],
2133
+ matr1[1][3] * matr2[2][2],
2134
+ matr1[1][3] * matr2[2][3]
2135
+ ], [
2136
+ matr1[1][0] * matr2[3][0],
2137
+ matr1[1][0] * matr2[3][1],
2138
+ matr1[1][0] * matr2[3][2],
2139
+ matr1[1][0] * matr2[3][3],
2140
+ matr1[1][1] * matr2[3][0],
2141
+ matr1[1][1] * matr2[3][1],
2142
+ matr1[1][1] * matr2[3][2],
2143
+ matr1[1][1] * matr2[3][3],
2144
+ matr1[1][2] * matr2[3][0],
2145
+ matr1[1][2] * matr2[3][1],
2146
+ matr1[1][2] * matr2[3][2],
2147
+ matr1[1][2] * matr2[3][3],
2148
+ matr1[1][3] * matr2[3][0],
2149
+ matr1[1][3] * matr2[3][1],
2150
+ matr1[1][3] * matr2[3][2],
2151
+ matr1[1][3] * matr2[3][3]
2152
+ ], [
2153
+ matr1[2][0] * matr2[0][0],
2154
+ matr1[2][0] * matr2[0][1],
2155
+ matr1[2][0] * matr2[0][2],
2156
+ matr1[2][0] * matr2[0][3],
2157
+ matr1[2][1] * matr2[0][0],
2158
+ matr1[2][1] * matr2[0][1],
2159
+ matr1[2][1] * matr2[0][2],
2160
+ matr1[2][1] * matr2[0][3],
2161
+ matr1[2][2] * matr2[0][0],
2162
+ matr1[2][2] * matr2[0][1],
2163
+ matr1[2][2] * matr2[0][2],
2164
+ matr1[2][2] * matr2[0][3],
2165
+ matr1[2][3] * matr2[0][0],
2166
+ matr1[2][3] * matr2[0][1],
2167
+ matr1[2][3] * matr2[0][2],
2168
+ matr1[2][3] * matr2[0][3]
2169
+ ], [
2170
+ matr1[2][0] * matr2[1][0],
2171
+ matr1[2][0] * matr2[1][1],
2172
+ matr1[2][0] * matr2[1][2],
2173
+ matr1[2][0] * matr2[1][3],
2174
+ matr1[2][1] * matr2[1][0],
2175
+ matr1[2][1] * matr2[1][1],
2176
+ matr1[2][1] * matr2[1][2],
2177
+ matr1[2][1] * matr2[1][3],
2178
+ matr1[2][2] * matr2[1][0],
2179
+ matr1[2][2] * matr2[1][1],
2180
+ matr1[2][2] * matr2[1][2],
2181
+ matr1[2][2] * matr2[1][3],
2182
+ matr1[2][3] * matr2[1][0],
2183
+ matr1[2][3] * matr2[1][1],
2184
+ matr1[2][3] * matr2[1][2],
2185
+ matr1[2][3] * matr2[1][3]
2186
+ ], [
2187
+ matr1[2][0] * matr2[2][0],
2188
+ matr1[2][0] * matr2[2][1],
2189
+ matr1[2][0] * matr2[2][2],
2190
+ matr1[2][0] * matr2[2][3],
2191
+ matr1[2][1] * matr2[2][0],
2192
+ matr1[2][1] * matr2[2][1],
2193
+ matr1[2][1] * matr2[2][2],
2194
+ matr1[2][1] * matr2[2][3],
2195
+ matr1[2][2] * matr2[2][0],
2196
+ matr1[2][2] * matr2[2][1],
2197
+ matr1[2][2] * matr2[2][2],
2198
+ matr1[2][2] * matr2[2][3],
2199
+ matr1[2][3] * matr2[2][0],
2200
+ matr1[2][3] * matr2[2][1],
2201
+ matr1[2][3] * matr2[2][2],
2202
+ matr1[2][3] * matr2[2][3]
2203
+ ], [
2204
+ matr1[2][0] * matr2[3][0],
2205
+ matr1[2][0] * matr2[3][1],
2206
+ matr1[2][0] * matr2[3][2],
2207
+ matr1[2][0] * matr2[3][3],
2208
+ matr1[2][1] * matr2[3][0],
2209
+ matr1[2][1] * matr2[3][1],
2210
+ matr1[2][1] * matr2[3][2],
2211
+ matr1[2][1] * matr2[3][3],
2212
+ matr1[2][2] * matr2[3][0],
2213
+ matr1[2][2] * matr2[3][1],
2214
+ matr1[2][2] * matr2[3][2],
2215
+ matr1[2][2] * matr2[3][3],
2216
+ matr1[2][3] * matr2[3][0],
2217
+ matr1[2][3] * matr2[3][1],
2218
+ matr1[2][3] * matr2[3][2],
2219
+ matr1[2][3] * matr2[3][3]
2220
+ ], [
2221
+ matr1[3][0] * matr2[0][0],
2222
+ matr1[3][0] * matr2[0][1],
2223
+ matr1[3][0] * matr2[0][2],
2224
+ matr1[3][0] * matr2[0][3],
2225
+ matr1[3][1] * matr2[0][0],
2226
+ matr1[3][1] * matr2[0][1],
2227
+ matr1[3][1] * matr2[0][2],
2228
+ matr1[3][1] * matr2[0][3],
2229
+ matr1[3][2] * matr2[0][0],
2230
+ matr1[3][2] * matr2[0][1],
2231
+ matr1[3][2] * matr2[0][2],
2232
+ matr1[3][2] * matr2[0][3],
2233
+ matr1[3][3] * matr2[0][0],
2234
+ matr1[3][3] * matr2[0][1],
2235
+ matr1[3][3] * matr2[0][2],
2236
+ matr1[3][3] * matr2[0][3]
2237
+ ], [
2238
+ matr1[3][0] * matr2[1][0],
2239
+ matr1[3][0] * matr2[1][1],
2240
+ matr1[3][0] * matr2[1][2],
2241
+ matr1[3][0] * matr2[1][3],
2242
+ matr1[3][1] * matr2[1][0],
2243
+ matr1[3][1] * matr2[1][1],
2244
+ matr1[3][1] * matr2[1][2],
2245
+ matr1[3][1] * matr2[1][3],
2246
+ matr1[3][2] * matr2[1][0],
2247
+ matr1[3][2] * matr2[1][1],
2248
+ matr1[3][2] * matr2[1][2],
2249
+ matr1[3][2] * matr2[1][3],
2250
+ matr1[3][3] * matr2[1][0],
2251
+ matr1[3][3] * matr2[1][1],
2252
+ matr1[3][3] * matr2[1][2],
2253
+ matr1[3][3] * matr2[1][3]
2254
+ ], [
2255
+ matr1[3][0] * matr2[2][0],
2256
+ matr1[3][0] * matr2[2][1],
2257
+ matr1[3][0] * matr2[2][2],
2258
+ matr1[3][0] * matr2[2][3],
2259
+ matr1[3][1] * matr2[2][0],
2260
+ matr1[3][1] * matr2[2][1],
2261
+ matr1[3][1] * matr2[2][2],
2262
+ matr1[3][1] * matr2[2][3],
2263
+ matr1[3][2] * matr2[2][0],
2264
+ matr1[3][2] * matr2[2][1],
2265
+ matr1[3][2] * matr2[2][2],
2266
+ matr1[3][2] * matr2[2][3],
2267
+ matr1[3][3] * matr2[2][0],
2268
+ matr1[3][3] * matr2[2][1],
2269
+ matr1[3][3] * matr2[2][2],
2270
+ matr1[3][3] * matr2[2][3]
2271
+ ], [
2272
+ matr1[3][0] * matr2[3][0],
2273
+ matr1[3][0] * matr2[3][1],
2274
+ matr1[3][0] * matr2[3][2],
2275
+ matr1[3][0] * matr2[3][3],
2276
+ matr1[3][1] * matr2[3][0],
2277
+ matr1[3][1] * matr2[3][1],
2278
+ matr1[3][1] * matr2[3][2],
2279
+ matr1[3][1] * matr2[3][3],
2280
+ matr1[3][2] * matr2[3][0],
2281
+ matr1[3][2] * matr2[3][1],
2282
+ matr1[3][2] * matr2[3][2],
2283
+ matr1[3][2] * matr2[3][3],
2284
+ matr1[3][3] * matr2[3][0],
2285
+ matr1[3][3] * matr2[3][1],
2286
+ matr1[3][3] * matr2[3][2],
2287
+ matr1[3][3] * matr2[3][3]
2288
+ ]);
2289
+ }
2290
+ else {
2291
+ var result = Chalkboard.matr.init();
2292
+ for (var i = 0; i < Chalkboard.matr.rows(matr1); i++) {
2293
+ for (var j = 0; j < Chalkboard.matr.cols(matr1); j++) {
2294
+ for (var k = 0; k < Chalkboard.matr.rows(matr2); k++) {
2295
+ for (var l = 0; l < Chalkboard.matr.cols(matr2); l++) {
2296
+ if (!result[i * Chalkboard.matr.rows(matr2) + k]) {
2297
+ result[i * Chalkboard.matr.rows(matr2) + k] = [];
2298
+ }
2299
+ result[i * Chalkboard.matr.rows(matr2) + k][j * Chalkboard.matr.cols(matr2) + l] = matr1[i][j] * matr2[k][l];
1306
2300
  }
1307
- result[i * Chalkboard.matr.rows(matr2) + k][j * Chalkboard.matr.cols(matr2) + l] = matr1[i][j] * matr2[k][l];
1308
2301
  }
1309
2302
  }
1310
2303
  }
2304
+ return result;
1311
2305
  }
1312
- return result;
1313
2306
  };
1314
2307
  matr_1.mulVector = function (matr, vect) {
1315
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
2308
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
1316
2309
  if (Chalkboard.matr.rows(matr) === 2) {
1317
2310
  return Chalkboard.matr.toVector(Chalkboard.matr.mul(matr, Chalkboard.vect.toMatrix(vect)), 2);
1318
2311
  }
@@ -1320,7 +2313,7 @@ var Chalkboard;
1320
2313
  return Chalkboard.matr.mul(matr, Chalkboard.vect.toMatrix(vect));
1321
2314
  }
1322
2315
  }
1323
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
2316
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
1324
2317
  if (Chalkboard.matr.rows(matr) === 3) {
1325
2318
  return Chalkboard.matr.toVector(Chalkboard.matr.mul(matr, Chalkboard.vect.toMatrix(vect)), 3);
1326
2319
  }
@@ -1328,7 +2321,7 @@ var Chalkboard;
1328
2321
  return Chalkboard.matr.mul(matr, Chalkboard.vect.toMatrix(vect));
1329
2322
  }
1330
2323
  }
1331
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
2324
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
1332
2325
  if (Chalkboard.matr.rows(matr) === 4) {
1333
2326
  return Chalkboard.matr.toVector(Chalkboard.matr.mul(matr, Chalkboard.vect.toMatrix(vect)), 4);
1334
2327
  }
@@ -1341,21 +2334,169 @@ var Chalkboard;
1341
2334
  }
1342
2335
  };
1343
2336
  matr_1.negate = function (matr) {
1344
- var result = Chalkboard.matr.init();
1345
- for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1346
- result[i] = [];
1347
- for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1348
- result[i][j] = -matr[i][j];
2337
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
2338
+ return Chalkboard.matr.init([-matr[0][0], -matr[0][1]], [-matr[1][0], -matr[1][1]]);
2339
+ }
2340
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
2341
+ return Chalkboard.matr.init([-matr[0][0], -matr[0][1], -matr[0][2]], [-matr[1][0], -matr[1][1], -matr[1][2]], [-matr[2][0], -matr[2][1], -matr[2][2]]);
2342
+ }
2343
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
2344
+ return Chalkboard.matr.init([-matr[0][0], -matr[0][1], -matr[0][2], -matr[0][3]], [-matr[1][0], -matr[1][1], -matr[1][2], -matr[1][3]], [-matr[2][0], -matr[2][1], -matr[2][2], -matr[2][3]], [-matr[3][0], -matr[3][1], -matr[3][2], -matr[3][3]]);
2345
+ }
2346
+ else {
2347
+ var result = Chalkboard.matr.init();
2348
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2349
+ result[i] = [];
2350
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
2351
+ result[i][j] = -matr[i][j];
2352
+ }
1349
2353
  }
2354
+ return result;
2355
+ }
2356
+ };
2357
+ matr_1.norm = function (matr, p, q) {
2358
+ if (p === void 0) { p = 2; }
2359
+ if (q === void 0) { q = 2; }
2360
+ if (Chalkboard.matr.isSizeOf(matr, 2) && p === 2 && q === 2) {
2361
+ return Chalkboard.real.sqrt(matr[0][0] * matr[0][0] + matr[0][1] * matr[0][1] + matr[1][0] * matr[1][0] + matr[1][1] * matr[1][1]);
2362
+ }
2363
+ else if (Chalkboard.matr.isSizeOf(matr, 3) && p === 2 && q === 2) {
2364
+ return Chalkboard.real.sqrt(matr[0][0] * matr[0][0] +
2365
+ matr[0][1] * matr[0][1] +
2366
+ matr[0][2] * matr[0][2] +
2367
+ matr[1][0] * matr[1][0] +
2368
+ matr[1][1] * matr[1][1] +
2369
+ matr[1][2] * matr[1][2] +
2370
+ matr[2][0] * matr[2][0] +
2371
+ matr[2][1] * matr[2][1] +
2372
+ matr[2][2] * matr[2][2]);
2373
+ }
2374
+ else if (Chalkboard.matr.isSizeOf(matr, 4) && p === 2 && q === 2) {
2375
+ return Chalkboard.real.sqrt(matr[0][0] * matr[0][0] +
2376
+ matr[0][1] * matr[0][1] +
2377
+ matr[0][2] * matr[0][2] +
2378
+ matr[0][3] * matr[0][3] +
2379
+ matr[1][0] * matr[1][0] +
2380
+ matr[1][1] * matr[1][1] +
2381
+ matr[1][2] * matr[1][2] +
2382
+ matr[1][3] * matr[1][3] +
2383
+ matr[2][0] * matr[2][0] +
2384
+ matr[2][1] * matr[2][1] +
2385
+ matr[2][2] * matr[2][2] +
2386
+ matr[2][3] * matr[2][3] +
2387
+ matr[3][0] * matr[3][0] +
2388
+ matr[3][1] * matr[3][1] +
2389
+ matr[3][2] * matr[3][2] +
2390
+ matr[3][3] * matr[3][3]);
2391
+ }
2392
+ else {
2393
+ var result = 0;
2394
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2395
+ var rowResult = 0;
2396
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
2397
+ rowResult += Chalkboard.real.pow(matr[i][j], p);
2398
+ }
2399
+ result += Chalkboard.real.pow(rowResult, q / p);
2400
+ }
2401
+ return Chalkboard.real.pow(result, 1 / q);
2402
+ }
2403
+ };
2404
+ matr_1.normalize = function (matr, p, q) {
2405
+ if (p === void 0) { p = 2; }
2406
+ if (q === void 0) { q = 2; }
2407
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
2408
+ return Chalkboard.matr.init([matr[0][0] / Chalkboard.matr.norm(matr, p, q), matr[0][1] / Chalkboard.matr.norm(matr, p, q)], [matr[1][0] / Chalkboard.matr.norm(matr, p, q), matr[1][1] / Chalkboard.matr.norm(matr, p, q)]);
2409
+ }
2410
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
2411
+ return Chalkboard.matr.init([matr[0][0] / Chalkboard.matr.norm(matr, p, q), matr[0][1] / Chalkboard.matr.norm(matr, p, q), matr[0][2] / Chalkboard.matr.norm(matr, p, q)], [matr[1][0] / Chalkboard.matr.norm(matr, p, q), matr[1][1] / Chalkboard.matr.norm(matr, p, q), matr[1][2] / Chalkboard.matr.norm(matr, p, q)], [matr[2][0] / Chalkboard.matr.norm(matr, p, q), matr[2][1] / Chalkboard.matr.norm(matr, p, q), matr[2][2] / Chalkboard.matr.norm(matr, p, q)]);
2412
+ }
2413
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
2414
+ return Chalkboard.matr.init([
2415
+ matr[0][0] / Chalkboard.matr.norm(matr, p, q),
2416
+ matr[0][1] / Chalkboard.matr.norm(matr, p, q),
2417
+ matr[0][2] / Chalkboard.matr.norm(matr, p, q),
2418
+ matr[0][3] / Chalkboard.matr.norm(matr, p, q)
2419
+ ], [
2420
+ matr[1][0] / Chalkboard.matr.norm(matr, p, q),
2421
+ matr[1][1] / Chalkboard.matr.norm(matr, p, q),
2422
+ matr[1][2] / Chalkboard.matr.norm(matr, p, q),
2423
+ matr[1][3] / Chalkboard.matr.norm(matr, p, q)
2424
+ ], [
2425
+ matr[2][0] / Chalkboard.matr.norm(matr, p, q),
2426
+ matr[2][1] / Chalkboard.matr.norm(matr, p, q),
2427
+ matr[2][2] / Chalkboard.matr.norm(matr, p, q),
2428
+ matr[2][3] / Chalkboard.matr.norm(matr, p, q)
2429
+ ], [
2430
+ matr[3][0] / Chalkboard.matr.norm(matr, p, q),
2431
+ matr[3][1] / Chalkboard.matr.norm(matr, p, q),
2432
+ matr[3][2] / Chalkboard.matr.norm(matr, p, q),
2433
+ matr[3][3] / Chalkboard.matr.norm(matr, p, q)
2434
+ ]);
2435
+ }
2436
+ else {
2437
+ var result = Chalkboard.matr.init();
2438
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2439
+ result[i] = [];
2440
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
2441
+ result[i][j] = matr[i][j] / Chalkboard.matr.norm(matr, p, q);
2442
+ }
2443
+ }
2444
+ return result;
2445
+ }
2446
+ };
2447
+ matr_1.normsq = function (matr, p, q) {
2448
+ if (p === void 0) { p = 2; }
2449
+ if (q === void 0) { q = 2; }
2450
+ if (Chalkboard.matr.isSizeOf(matr, 2) && p === 2 && q === 2) {
2451
+ return matr[0][0] * matr[0][0] + matr[0][1] * matr[0][1] + matr[1][0] * matr[1][0] + matr[1][1] * matr[1][1];
2452
+ }
2453
+ else if (Chalkboard.matr.isSizeOf(matr, 3) && p === 2 && q === 2) {
2454
+ return (matr[0][0] * matr[0][0] +
2455
+ matr[0][1] * matr[0][1] +
2456
+ matr[0][2] * matr[0][2] +
2457
+ matr[1][0] * matr[1][0] +
2458
+ matr[1][1] * matr[1][1] +
2459
+ matr[1][2] * matr[1][2] +
2460
+ matr[2][0] * matr[2][0] +
2461
+ matr[2][1] * matr[2][1] +
2462
+ matr[2][2] * matr[2][2]);
2463
+ }
2464
+ else if (Chalkboard.matr.isSizeOf(matr, 4) && p === 2 && q === 2) {
2465
+ return (matr[0][0] * matr[0][0] +
2466
+ matr[0][1] * matr[0][1] +
2467
+ matr[0][2] * matr[0][2] +
2468
+ matr[0][3] * matr[0][3] +
2469
+ matr[1][0] * matr[1][0] +
2470
+ matr[1][1] * matr[1][1] +
2471
+ matr[1][2] * matr[1][2] +
2472
+ matr[1][3] * matr[1][3] +
2473
+ matr[2][0] * matr[2][0] +
2474
+ matr[2][1] * matr[2][1] +
2475
+ matr[2][2] * matr[2][2] +
2476
+ matr[2][3] * matr[2][3] +
2477
+ matr[3][0] * matr[3][0] +
2478
+ matr[3][1] * matr[3][1] +
2479
+ matr[3][2] * matr[3][2] +
2480
+ matr[3][3] * matr[3][3]);
2481
+ }
2482
+ else {
2483
+ var result = 0;
2484
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2485
+ var rowResult = 0;
2486
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
2487
+ rowResult += Chalkboard.real.pow(matr[i][j], p);
2488
+ }
2489
+ result += Chalkboard.real.pow(rowResult, q / p);
2490
+ }
2491
+ return result;
1350
2492
  }
1351
- return result;
1352
2493
  };
1353
2494
  matr_1.nullspace = function (matr) {
1354
2495
  var augmented = matr.map(function (row) {
1355
2496
  return row.slice().concat(Array(Chalkboard.matr.rows(matr)).fill(0));
1356
2497
  });
1357
- var reduced = Chalkboard.matr.reduce(augmented);
1358
- return reduced
2498
+ var rowEchelonForm = Chalkboard.matr.Gaussian(augmented);
2499
+ return rowEchelonForm
1359
2500
  .filter(function (row) {
1360
2501
  return row.slice(0, Chalkboard.matr.rows(matr)).every(function (element) {
1361
2502
  return element === 0;
@@ -1365,8 +2506,52 @@ var Chalkboard;
1365
2506
  return row.slice(Chalkboard.matr.rows(matr));
1366
2507
  });
1367
2508
  };
2509
+ matr_1.perm = function (matr) {
2510
+ if (Chalkboard.matr.isSquare(matr)) {
2511
+ if (Chalkboard.matr.rows(matr) === 1) {
2512
+ return matr[0][0];
2513
+ }
2514
+ else if (Chalkboard.matr.rows(matr) === 2) {
2515
+ return matr[0][0] * matr[1][1] + matr[0][1] * matr[1][0];
2516
+ }
2517
+ else if (Chalkboard.matr.rows(matr) === 3) {
2518
+ return (matr[0][0] * (matr[1][1] * matr[2][2] + matr[1][2] * matr[2][1]) +
2519
+ matr[0][1] * (matr[1][0] * matr[2][2] + matr[1][2] * matr[2][0]) +
2520
+ matr[0][2] * (matr[1][0] * matr[2][1] + matr[1][1] * matr[2][0]));
2521
+ }
2522
+ else if (Chalkboard.matr.rows(matr) === 4) {
2523
+ return (matr[0][0] *
2524
+ (matr[1][1] * (matr[2][2] * matr[3][3] + matr[2][3] * matr[3][2]) +
2525
+ matr[1][2] * (matr[2][1] * matr[3][3] + matr[2][3] * matr[3][1]) +
2526
+ matr[1][3] * (matr[2][1] * matr[3][2] + matr[2][2] * matr[3][1])) +
2527
+ matr[0][1] *
2528
+ (matr[1][0] * (matr[2][2] * matr[3][3] + matr[2][3] * matr[3][2]) +
2529
+ matr[1][2] * (matr[2][0] * matr[3][3] + matr[2][3] * matr[3][0]) +
2530
+ matr[1][3] * (matr[2][0] * matr[3][2] + matr[2][2] * matr[3][0])) +
2531
+ matr[0][2] *
2532
+ (matr[1][0] * (matr[2][1] * matr[3][3] + matr[2][3] * matr[3][1]) +
2533
+ matr[1][1] * (matr[2][0] * matr[3][3] + matr[2][3] * matr[3][0]) +
2534
+ matr[1][3] * (matr[2][0] * matr[3][1] + matr[2][1] * matr[3][0])) +
2535
+ matr[0][3] *
2536
+ (matr[1][0] * (matr[2][1] * matr[3][2] + matr[2][2] * matr[3][1]) +
2537
+ matr[1][1] * (matr[2][0] * matr[3][2] + matr[2][2] * matr[3][0]) +
2538
+ matr[1][2] * (matr[2][0] * matr[3][1] + matr[2][1] * matr[3][0])));
2539
+ }
2540
+ else {
2541
+ var result = 0;
2542
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2543
+ var cofactor_2 = matr[0][i] * Chalkboard.matr.perm(Chalkboard.matr.cofactor(matr, 0, i));
2544
+ result += Math.abs(cofactor_2);
2545
+ }
2546
+ return result;
2547
+ }
2548
+ }
2549
+ else {
2550
+ throw new TypeError('Parameter "matr" must be of type "ChalkboardMatrix" that is square.');
2551
+ }
2552
+ };
1368
2553
  matr_1.pow = function (matr, num) {
1369
- if (Chalkboard.matr.rows(matr) === Chalkboard.matr.cols(matr)) {
2554
+ if (Chalkboard.matr.isSquare(matr)) {
1370
2555
  if (num === 0) {
1371
2556
  return Chalkboard.matr.identity(Chalkboard.matr.rows(matr));
1372
2557
  }
@@ -1385,48 +2570,46 @@ var Chalkboard;
1385
2570
  matr_1.print = function (matr) {
1386
2571
  console.log(Chalkboard.matr.toString(matr));
1387
2572
  };
1388
- matr_1.pull = function (matr, type, rowORcol) {
1389
- rowORcol -= 1;
1390
- if (type === "row") {
1391
- matr.splice(rowORcol, 1);
2573
+ matr_1.pull = function (matr, index, axis) {
2574
+ if (axis === 0) {
2575
+ matr.splice(index, 1);
1392
2576
  return matr;
1393
2577
  }
1394
- else if (type === "col") {
2578
+ else if (axis === 1) {
1395
2579
  for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1396
- matr[i].splice(rowORcol, 1);
2580
+ matr[i].splice(index, 1);
1397
2581
  }
1398
2582
  return matr;
1399
2583
  }
1400
2584
  else {
1401
- throw new TypeError('Parameter "type" must be "row" or "col".');
2585
+ throw new TypeError('Parameter "axis" must be 0 or 1.');
1402
2586
  }
1403
2587
  };
1404
- matr_1.push = function (matr, type, rowORcol, elements) {
1405
- rowORcol -= 1;
1406
- if (type === "row") {
1407
- matr.splice(rowORcol, 0, elements);
2588
+ matr_1.push = function (matr, index, axis, elements) {
2589
+ if (axis === 0) {
2590
+ matr.splice(index, 0, elements);
1408
2591
  return matr;
1409
2592
  }
1410
- else if (type === "col") {
2593
+ else if (axis === 1) {
1411
2594
  for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1412
- matr[i].splice(rowORcol, 0, elements[i]);
2595
+ matr[i].splice(index, 0, elements[i]);
1413
2596
  }
1414
2597
  return matr;
1415
2598
  }
1416
2599
  else {
1417
- throw new TypeError('Parameter "type" must be "row" or "col".');
2600
+ throw new TypeError('Parameter "axis" must be 0 or 1.');
1418
2601
  }
1419
2602
  };
1420
2603
  matr_1.QRdecomp = function (matr) {
1421
2604
  var Q = Chalkboard.matr.identity(Chalkboard.matr.rows(matr)), R = Chalkboard.matr.copy(matr);
1422
2605
  for (var j = 0; j < Math.min(Chalkboard.matr.rows(matr), Chalkboard.matr.cols(matr)) - (Chalkboard.matr.rows(matr) > Chalkboard.matr.cols(matr) ? 0 : 1); j++) {
1423
- var norm = 0;
2606
+ var norm_1 = 0;
1424
2607
  for (var i = j; i < Chalkboard.matr.rows(matr); i++) {
1425
- norm += R[i][j] * R[i][j];
2608
+ norm_1 += R[i][j] * R[i][j];
1426
2609
  }
1427
- norm = Chalkboard.real.sqrt(norm);
2610
+ norm_1 = Chalkboard.real.sqrt(norm_1);
1428
2611
  var v = [];
1429
- v[0] = norm - R[j][j];
2612
+ v[0] = norm_1 - R[j][j];
1430
2613
  var normalizer = v[0] * v[0];
1431
2614
  for (var i = 1; i < Chalkboard.matr.rows(matr) - j; i++) {
1432
2615
  v[i] = -R[i + j][j];
@@ -1436,7 +2619,7 @@ var Chalkboard;
1436
2619
  for (var i = 0; i < v.length; i++) {
1437
2620
  v[i] *= normalizer;
1438
2621
  }
1439
- R[j][j] = norm;
2622
+ R[j][j] = norm_1;
1440
2623
  for (var i = j + 1; i < Chalkboard.matr.rows(R); i++) {
1441
2624
  R[i][j] = 0;
1442
2625
  }
@@ -1465,72 +2648,56 @@ var Chalkboard;
1465
2648
  };
1466
2649
  matr_1.random = function (inf, sup, rows, cols) {
1467
2650
  if (cols === void 0) { cols = rows; }
1468
- var result = Chalkboard.matr.init();
1469
- for (var i = 0; i < rows; i++) {
1470
- result.push([]);
1471
- for (var j = 0; j < cols; j++) {
1472
- result[i].push(Chalkboard.numb.random(inf, sup));
2651
+ if (rows === 2 && cols === 2) {
2652
+ return Chalkboard.matr.init([Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup)], [Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup)]);
2653
+ }
2654
+ else if (rows === 3 && cols === 3) {
2655
+ return Chalkboard.matr.init([Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup)], [Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup)], [Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup)]);
2656
+ }
2657
+ else if (rows === 4 && cols === 4) {
2658
+ return Chalkboard.matr.init([Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup)], [Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup)], [Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup)], [Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup), Chalkboard.numb.random(inf, sup)]);
2659
+ }
2660
+ else {
2661
+ var result = Chalkboard.matr.init();
2662
+ for (var i = 0; i < rows; i++) {
2663
+ result.push([]);
2664
+ for (var j = 0; j < cols; j++) {
2665
+ result[i].push(Chalkboard.numb.random(inf, sup));
2666
+ }
1473
2667
  }
2668
+ return result;
1474
2669
  }
1475
- return result;
1476
2670
  };
1477
2671
  matr_1.rank = function (matr) {
1478
- return Chalkboard.matr.reduce(matr).filter(function (row) {
2672
+ return Chalkboard.matr.Gaussian(matr).filter(function (row) {
1479
2673
  return row.some(function (element) {
1480
2674
  return element !== 0;
1481
2675
  });
1482
2676
  }).length;
1483
2677
  };
1484
2678
  matr_1.reciprocate = function (matr) {
1485
- var result = Chalkboard.matr.init();
1486
- for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1487
- result[i] = [];
1488
- for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1489
- result[i][j] = 1 / matr[i][j];
1490
- }
2679
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
2680
+ return Chalkboard.matr.init([1 / matr[0][0], 1 / matr[0][1]], [1 / matr[1][0], 1 / matr[1][1]]);
1491
2681
  }
1492
- return result;
1493
- };
1494
- matr_1.reduce = function (matr) {
1495
- var lead = 0;
1496
- for (var row = 0; row < Chalkboard.matr.rows(matr); row++) {
1497
- if (lead >= Chalkboard.matr.cols(matr)) {
1498
- break;
1499
- }
1500
- var i = row;
1501
- while (matr[i][lead] === 0) {
1502
- i++;
1503
- if (i === Chalkboard.matr.rows(matr)) {
1504
- i = row;
1505
- lead++;
1506
- if (Chalkboard.matr.cols(matr) === lead) {
1507
- return matr;
1508
- }
1509
- }
1510
- }
1511
- var temp = matr[i];
1512
- matr[i] = matr[row];
1513
- matr[row] = temp;
1514
- var scl_1 = matr[row][lead];
1515
- for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1516
- matr[row][j] /= scl_1;
1517
- }
1518
- for (var i_1 = 0; i_1 < Chalkboard.matr.rows(matr); i_1++) {
1519
- if (i_1 !== row) {
1520
- var coeff = matr[i_1][lead];
1521
- for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1522
- matr[i_1][j] -= coeff * matr[row][j];
1523
- }
2682
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
2683
+ return Chalkboard.matr.init([1 / matr[0][0], 1 / matr[0][1], 1 / matr[0][2]], [1 / matr[1][0], 1 / matr[1][1], 1 / matr[1][2]], [1 / matr[2][0], 1 / matr[2][1], 1 / matr[2][2]]);
2684
+ }
2685
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
2686
+ return Chalkboard.matr.init([1 / matr[0][0], 1 / matr[0][1], 1 / matr[0][2], 1 / matr[0][3]], [1 / matr[1][0], 1 / matr[1][1], 1 / matr[1][2], 1 / matr[1][3]], [1 / matr[2][0], 1 / matr[2][1], 1 / matr[2][2], 1 / matr[2][3]], [1 / matr[3][0], 1 / matr[3][1], 1 / matr[3][2], 1 / matr[3][3]]);
2687
+ }
2688
+ else {
2689
+ var result = Chalkboard.matr.init();
2690
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2691
+ result[i] = [];
2692
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
2693
+ result[i][j] = 1 / matr[i][j];
1524
2694
  }
1525
2695
  }
1526
- lead++;
2696
+ return result;
1527
2697
  }
1528
- return matr;
1529
2698
  };
1530
2699
  matr_1.resize = function (matr, rows, cols) {
1531
- if (cols === undefined) {
1532
- cols = rows;
1533
- }
2700
+ if (cols === void 0) { cols = rows; }
1534
2701
  var result = Chalkboard.matr.init();
1535
2702
  var flat = Chalkboard.matr.toArray(matr);
1536
2703
  var index = 0;
@@ -1552,20 +2719,31 @@ var Chalkboard;
1552
2719
  }
1553
2720
  };
1554
2721
  matr_1.round = function (matr) {
1555
- var result = Chalkboard.matr.init();
1556
- for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1557
- result[i] = [];
1558
- for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1559
- result[i][j] = Math.round(matr[i][j]);
2722
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
2723
+ return Chalkboard.matr.init([Math.round(matr[0][0]), Math.round(matr[0][1])], [Math.round(matr[1][0]), Math.round(matr[1][1])]);
2724
+ }
2725
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
2726
+ return Chalkboard.matr.init([Math.round(matr[0][0]), Math.round(matr[0][1]), Math.round(matr[0][2])], [Math.round(matr[1][0]), Math.round(matr[1][1]), Math.round(matr[1][2])], [Math.round(matr[2][0]), Math.round(matr[2][1]), Math.round(matr[2][2])]);
2727
+ }
2728
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
2729
+ return Chalkboard.matr.init([Math.round(matr[0][0]), Math.round(matr[0][1]), Math.round(matr[0][2]), Math.round(matr[0][3])], [Math.round(matr[1][0]), Math.round(matr[1][1]), Math.round(matr[1][2]), Math.round(matr[1][3])], [Math.round(matr[2][0]), Math.round(matr[2][1]), Math.round(matr[2][2]), Math.round(matr[2][3])], [Math.round(matr[3][0]), Math.round(matr[3][1]), Math.round(matr[3][2]), Math.round(matr[3][3])]);
2730
+ }
2731
+ else {
2732
+ var result = Chalkboard.matr.init();
2733
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2734
+ result[i] = [];
2735
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
2736
+ result[i][j] = Math.round(matr[i][j]);
2737
+ }
1560
2738
  }
2739
+ return result;
1561
2740
  }
1562
- return result;
1563
2741
  };
1564
2742
  matr_1.rows = function (matr) {
1565
2743
  return matr.length;
1566
2744
  };
1567
2745
  matr_1.rowspace = function (matr) {
1568
- return Chalkboard.matr.reduce(matr).filter(function (row) {
2746
+ return Chalkboard.matr.Gaussian(matr).filter(function (row) {
1569
2747
  return row.some(function (element) {
1570
2748
  return element !== 0;
1571
2749
  });
@@ -1586,34 +2764,43 @@ var Chalkboard;
1586
2764
  }
1587
2765
  };
1588
2766
  matr_1.scl = function (matr, num) {
1589
- var result = Chalkboard.matr.init();
1590
- for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1591
- result[i] = [];
1592
- for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1593
- result[i][j] = matr[i][j] * num;
1594
- }
2767
+ if (Chalkboard.matr.isSizeOf(matr, 2, 1)) {
2768
+ return Chalkboard.matr.init([matr[0][0] * num], [matr[1][0] * num]);
1595
2769
  }
1596
- return result;
1597
- };
1598
- matr_1.shift = function (size, shiftAmount) {
1599
- if (shiftAmount === void 0) { shiftAmount = 1; }
1600
- var result = Chalkboard.matr.fill(0, size, size);
1601
- for (var i = 0; i < size; i++) {
1602
- result[i] = [];
1603
- for (var j = 0; j < size; j++) {
1604
- result[i][j] = Chalkboard.numb.Kronecker(i + shiftAmount, j);
2770
+ else if (Chalkboard.matr.isSizeOf(matr, 2)) {
2771
+ return Chalkboard.matr.init([matr[0][0] * num, matr[0][1] * num], [matr[1][0] * num, matr[1][1] * num]);
2772
+ }
2773
+ else if (Chalkboard.matr.isSizeOf(matr, 3, 1)) {
2774
+ return Chalkboard.matr.init([matr[0][0] * num], [matr[1][0] * num], [matr[2][0] * num]);
2775
+ }
2776
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
2777
+ return Chalkboard.matr.init([matr[0][0] * num, matr[0][1] * num, matr[0][2] * num], [matr[1][0] * num, matr[1][1] * num, matr[1][2] * num], [matr[2][0] * num, matr[2][1] * num, matr[2][2] * num]);
2778
+ }
2779
+ else if (Chalkboard.matr.isSizeOf(matr, 4, 1)) {
2780
+ return Chalkboard.matr.init([matr[0][0] * num], [matr[1][0] * num], [matr[2][0] * num], [matr[3][0] * num]);
2781
+ }
2782
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
2783
+ return Chalkboard.matr.init([matr[0][0] * num, matr[0][1] * num, matr[0][2] * num, matr[0][3] * num], [matr[1][0] * num, matr[1][1] * num, matr[1][2] * num, matr[1][3] * num], [matr[2][0] * num, matr[2][1] * num, matr[2][2] * num, matr[2][3] * num], [matr[3][0] * num, matr[3][1] * num, matr[3][2] * num, matr[3][3] * num]);
2784
+ }
2785
+ else {
2786
+ var result = Chalkboard.matr.init();
2787
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2788
+ result[i] = [];
2789
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
2790
+ result[i][j] = matr[i][j] * num;
2791
+ }
1605
2792
  }
2793
+ return result;
1606
2794
  }
1607
- return result;
1608
2795
  };
1609
2796
  matr_1.solve = function (matrA, matrB) {
1610
- if (Chalkboard.matr.rows(matrA) === Chalkboard.matr.cols(matrA)) {
2797
+ if (Chalkboard.matr.isSquare(matrA)) {
1611
2798
  if (Chalkboard.matr.rows(matrA) === Chalkboard.matr.rows(matrB)) {
1612
2799
  if (Chalkboard.matr.det(matrA) !== 0) {
1613
2800
  return Chalkboard.matr.mul(Chalkboard.matr.invert(matrA), matrB);
1614
2801
  }
1615
2802
  else {
1616
- throw new TypeError('Parameter "matrA" must be of type "ChalkboardMatrix" that is invertible.');
2803
+ throw new TypeError('Parameter "matrA" must be of type "ChalkboardMatrix" that has a non-zero determinant.');
1617
2804
  }
1618
2805
  }
1619
2806
  else {
@@ -1621,53 +2808,190 @@ var Chalkboard;
1621
2808
  }
1622
2809
  }
1623
2810
  else {
1624
- throw new TypeError('Parameters "matrA" must be of type "ChalkboardMatrix" that is square.');
2811
+ throw new TypeError('Parameter "matrA" must be of type "ChalkboardMatrix" that is square.');
1625
2812
  }
1626
2813
  };
1627
2814
  matr_1.sub = function (matr1, matr2) {
1628
- if (Chalkboard.matr.rows(matr1) === Chalkboard.matr.rows(matr2) && Chalkboard.matr.cols(matr1) === Chalkboard.matr.cols(matr2)) {
1629
- var result = Chalkboard.matr.init();
1630
- for (var i = 0; i < Chalkboard.matr.rows(matr1); i++) {
1631
- result[i] = [];
1632
- for (var j = 0; j < Chalkboard.matr.cols(matr1); j++) {
1633
- result[i][j] = matr1[i][j] - matr2[i][j];
2815
+ if (Chalkboard.matr.isSizeEqual(matr1, matr2)) {
2816
+ if (Chalkboard.matr.isSizeOf(matr1, 2)) {
2817
+ return Chalkboard.matr.init([matr1[0][0] - matr2[0][0], matr1[0][1] - matr2[0][1]], [matr1[1][0] - matr2[1][0], matr1[1][1] - matr2[1][1]]);
2818
+ }
2819
+ else if (Chalkboard.matr.isSizeOf(matr1, 3)) {
2820
+ return Chalkboard.matr.init([matr1[0][0] - matr2[0][0], matr1[0][1] - matr2[0][1], matr1[0][2] - matr2[0][2]], [matr1[1][0] - matr2[1][0], matr1[1][1] - matr2[1][1], matr1[1][2] - matr2[1][2]], [matr1[2][0] - matr2[2][0], matr1[2][1] - matr2[2][1], matr1[2][2] - matr2[2][2]]);
2821
+ }
2822
+ else if (Chalkboard.matr.isSizeOf(matr1, 4)) {
2823
+ return Chalkboard.matr.init([matr1[0][0] - matr2[0][0], matr1[0][1] - matr2[0][1], matr1[0][2] - matr2[0][2], matr1[0][3] - matr2[0][3]], [matr1[1][0] - matr2[1][0], matr1[1][1] - matr2[1][1], matr1[1][2] - matr2[1][2], matr1[1][3] - matr2[1][3]], [matr1[2][0] - matr2[2][0], matr1[2][1] - matr2[2][1], matr1[2][2] - matr2[2][2], matr1[2][3] - matr2[2][3]], [matr1[3][0] - matr2[3][0], matr1[3][1] - matr2[3][1], matr1[3][2] - matr2[3][2], matr1[3][3] - matr2[3][3]]);
2824
+ }
2825
+ else {
2826
+ var result = Chalkboard.matr.init();
2827
+ for (var i = 0; i < Chalkboard.matr.rows(matr1); i++) {
2828
+ result[i] = [];
2829
+ for (var j = 0; j < Chalkboard.matr.cols(matr1); j++) {
2830
+ result[i][j] = matr1[i][j] - matr2[i][j];
2831
+ }
1634
2832
  }
2833
+ return result;
1635
2834
  }
1636
- return result;
1637
2835
  }
1638
2836
  else {
1639
2837
  throw new TypeError('Parameters "matr1" and "matr2" must be of type "ChalkboardMatrix" with equivalent numbers of rows and columns.');
1640
2838
  }
1641
2839
  };
2840
+ matr_1.symmetricBinomial = function (size) {
2841
+ if (size === 2) {
2842
+ return Chalkboard.matr.init([1, 1], [1, 2]);
2843
+ }
2844
+ else if (size === 3) {
2845
+ return Chalkboard.matr.init([1, 1, 1], [1, 2, 3], [1, 3, 6]);
2846
+ }
2847
+ else if (size === 4) {
2848
+ return Chalkboard.matr.init([1, 1, 1, 1], [1, 2, 3, 4], [1, 3, 6, 10], [1, 4, 10, 20]);
2849
+ }
2850
+ else {
2851
+ return Chalkboard.matr.mul(Chalkboard.matr.lowerBinomial(size), Chalkboard.matr.upperBinomial(size));
2852
+ }
2853
+ };
1642
2854
  matr_1.toArray = function (matr) {
1643
- var result = [];
1644
- for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1645
- for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1646
- result.push(matr[i][j]);
2855
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
2856
+ return [matr[0][0], matr[0][1], matr[1][0], matr[1][1]];
2857
+ }
2858
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
2859
+ return [matr[0][0], matr[0][1], matr[0][2], matr[1][0], matr[1][1], matr[1][2], matr[2][0], matr[2][1], matr[2][2]];
2860
+ }
2861
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
2862
+ return [
2863
+ matr[0][0],
2864
+ matr[0][1],
2865
+ matr[0][2],
2866
+ matr[0][3],
2867
+ matr[1][0],
2868
+ matr[1][1],
2869
+ matr[1][2],
2870
+ matr[1][3],
2871
+ matr[2][0],
2872
+ matr[2][1],
2873
+ matr[2][2],
2874
+ matr[2][3],
2875
+ matr[3][0],
2876
+ matr[3][1],
2877
+ matr[3][2],
2878
+ matr[3][3]
2879
+ ];
2880
+ }
2881
+ else {
2882
+ var result = [];
2883
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2884
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
2885
+ result.push(matr[i][j]);
2886
+ }
1647
2887
  }
2888
+ return result;
1648
2889
  }
1649
- return result;
1650
2890
  };
1651
2891
  matr_1.toObject = function (matr) {
1652
- var result = {};
1653
- for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1654
- result["i" + (i + 1)] = {};
1655
- for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1656
- result["i" + (i + 1)]["j" + (j + 1)] = matr[i][j];
2892
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
2893
+ return {
2894
+ i1: { j1: matr[0][0], j2: matr[0][1] },
2895
+ i2: { j1: matr[1][0], j2: matr[1][1] }
2896
+ };
2897
+ }
2898
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
2899
+ return {
2900
+ i1: { j1: matr[0][0], j2: matr[0][1], j3: matr[0][2] },
2901
+ i2: { j1: matr[1][0], j2: matr[1][1], j3: matr[1][2] },
2902
+ i3: { j1: matr[2][0], j2: matr[2][1], j3: matr[2][2] }
2903
+ };
2904
+ }
2905
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
2906
+ return {
2907
+ i1: { j1: matr[0][0], j2: matr[0][1], j3: matr[0][2], j4: matr[0][3] },
2908
+ i2: { j1: matr[1][0], j2: matr[1][1], j3: matr[1][2], j4: matr[1][3] },
2909
+ i3: { j1: matr[2][0], j2: matr[2][1], j3: matr[2][2], j4: matr[2][3] },
2910
+ i4: { j1: matr[3][0], j2: matr[3][1], j3: matr[3][2], j4: matr[3][3] }
2911
+ };
2912
+ }
2913
+ else {
2914
+ var result = {};
2915
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2916
+ result["i" + (i + 1)] = {};
2917
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
2918
+ result["i" + (i + 1)]["j" + (j + 1)] = matr[i][j];
2919
+ }
1657
2920
  }
2921
+ return result;
1658
2922
  }
1659
- return result;
1660
2923
  };
1661
2924
  matr_1.toString = function (matr) {
1662
- var result = "";
1663
- for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1664
- result += "[ ";
1665
- for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1666
- result += matr[i][j].toString() + " ";
2925
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
2926
+ return "[ " + matr[0][0].toString() + " " + matr[0][1].toString() + " ]\n[ " + matr[1][0].toString() + " " + matr[1][1].toString() + " ]";
2927
+ }
2928
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
2929
+ return ("[ " +
2930
+ matr[0][0].toString() +
2931
+ " " +
2932
+ matr[0][1].toString() +
2933
+ " " +
2934
+ matr[0][2].toString() +
2935
+ " ]\n[ " +
2936
+ matr[1][0].toString() +
2937
+ " " +
2938
+ matr[1][1].toString() +
2939
+ " " +
2940
+ matr[1][2].toString() +
2941
+ " ]\n[ " +
2942
+ matr[2][0].toString() +
2943
+ " " +
2944
+ matr[2][1].toString() +
2945
+ " " +
2946
+ matr[2][2].toString() +
2947
+ " ]");
2948
+ }
2949
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
2950
+ return ("[ " +
2951
+ matr[0][0].toString() +
2952
+ " " +
2953
+ matr[0][1].toString() +
2954
+ " " +
2955
+ matr[0][2].toString() +
2956
+ " " +
2957
+ matr[0][3].toString() +
2958
+ " ]\n[ " +
2959
+ matr[1][0].toString() +
2960
+ " " +
2961
+ matr[1][1].toString() +
2962
+ " " +
2963
+ matr[1][2].toString() +
2964
+ " " +
2965
+ matr[1][3].toString() +
2966
+ " ]\n[ " +
2967
+ matr[2][0].toString() +
2968
+ " " +
2969
+ matr[2][1].toString() +
2970
+ " " +
2971
+ matr[2][2].toString() +
2972
+ " " +
2973
+ matr[2][3].toString() +
2974
+ " ]\n[ " +
2975
+ matr[3][0].toString() +
2976
+ " " +
2977
+ matr[3][1].toString() +
2978
+ " " +
2979
+ matr[3][2].toString() +
2980
+ " " +
2981
+ matr[3][3].toString() +
2982
+ " ]");
2983
+ }
2984
+ else {
2985
+ var result = "";
2986
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
2987
+ result += "[ ";
2988
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
2989
+ result += matr[i][j].toString() + " ";
2990
+ }
2991
+ result = result.trimEnd() + " ]\n";
1667
2992
  }
1668
- result = result.trimEnd() + " ]\n";
2993
+ return result;
1669
2994
  }
1670
- return result;
1671
2995
  };
1672
2996
  matr_1.toTensor = function (matr) {
1673
2997
  var _a;
@@ -1675,73 +2999,92 @@ var Chalkboard;
1675
2999
  for (var _i = 1; _i < arguments.length; _i++) {
1676
3000
  size[_i - 1] = arguments[_i];
1677
3001
  }
1678
- if (Array.isArray(size[0])) {
1679
- size = size[0];
1680
- }
3002
+ size = Array.isArray(size[0]) ? size[0] : size;
1681
3003
  return (_a = Chalkboard.tens).resize.apply(_a, __spreadArray([matr], size, false));
1682
3004
  };
1683
- matr_1.toVector = function (matr, dimension, type, rowORcol) {
1684
- if (type === void 0) { type = "col"; }
1685
- if (rowORcol === void 0) { rowORcol = 1; }
1686
- rowORcol -= 1;
3005
+ matr_1.toVector = function (matr, dimension, index, axis) {
3006
+ if (index === void 0) { index = 0; }
3007
+ if (axis === void 0) { axis = 0; }
1687
3008
  if (dimension === 2) {
1688
- if (type === "col") {
1689
- return Chalkboard.vect.init(matr[0][rowORcol], matr[1][rowORcol]);
3009
+ if (axis === 0) {
3010
+ return Chalkboard.vect.init(matr[0][index], matr[1][index]);
1690
3011
  }
1691
- else if (type === "row") {
1692
- return Chalkboard.vect.init(matr[rowORcol][0], matr[rowORcol][1]);
3012
+ else if (axis === 1) {
3013
+ return Chalkboard.vect.init(matr[index][0], matr[index][1]);
1693
3014
  }
1694
3015
  else {
1695
- throw new TypeError('Parameter "type" must be "col" or "row".');
3016
+ throw new TypeError('Parameter "axis" must be 0 or 1.');
1696
3017
  }
1697
3018
  }
1698
3019
  else if (dimension === 3) {
1699
- if (type === "col") {
1700
- return Chalkboard.vect.init(matr[0][rowORcol], matr[1][rowORcol], matr[2][rowORcol]);
3020
+ if (axis === 0) {
3021
+ return Chalkboard.vect.init(matr[0][index], matr[1][index], matr[2][index]);
1701
3022
  }
1702
- else if (type === "row") {
1703
- return Chalkboard.vect.init(matr[rowORcol][0], matr[rowORcol][1], matr[rowORcol][2]);
3023
+ else if (axis === 1) {
3024
+ return Chalkboard.vect.init(matr[index][0], matr[index][1], matr[index][2]);
1704
3025
  }
1705
3026
  else {
1706
- throw new TypeError('Parameter "type" must be "col" or "row".');
3027
+ throw new TypeError('Parameter "axis" must be 0 or 1.');
1707
3028
  }
1708
3029
  }
1709
3030
  else if (dimension === 4) {
1710
- if (type === "col") {
1711
- return Chalkboard.vect.init(matr[0][rowORcol], matr[1][rowORcol], matr[2][rowORcol], matr[3][rowORcol]);
3031
+ if (axis === 0) {
3032
+ return Chalkboard.vect.init(matr[0][index], matr[1][index], matr[2][index], matr[3][index]);
1712
3033
  }
1713
- else if (type === "row") {
1714
- return Chalkboard.vect.init(matr[rowORcol][0], matr[rowORcol][1], matr[rowORcol][2], matr[rowORcol][3]);
3034
+ else if (axis === 1) {
3035
+ return Chalkboard.vect.init(matr[index][0], matr[index][1], matr[index][2], matr[index][3]);
1715
3036
  }
1716
3037
  else {
1717
- throw new TypeError('Parameter "type" must be "col" or "row".');
3038
+ throw new TypeError('Parameter "axis" must be 0 or 1.');
1718
3039
  }
1719
3040
  }
1720
3041
  else {
1721
- throw new TypeError('Parameter "vect" must be of type "ChalkboardVector" with 2, 3, or 4 dimensions.');
3042
+ throw new TypeError('Parameter "dimension" must be 2, 3, or 4.');
1722
3043
  }
1723
3044
  };
1724
3045
  matr_1.trace = function (matr) {
1725
- if (Chalkboard.matr.rows(matr) === Chalkboard.matr.cols(matr)) {
1726
- var result = 0;
1727
- for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1728
- result += matr[i][i];
3046
+ if (Chalkboard.matr.isSquare(matr)) {
3047
+ if (Chalkboard.matr.rows(matr) === 2) {
3048
+ return matr[0][0] + matr[1][1];
3049
+ }
3050
+ else if (Chalkboard.matr.rows(matr) === 3) {
3051
+ return matr[0][0] + matr[1][1] + matr[2][2];
3052
+ }
3053
+ else if (Chalkboard.matr.rows(matr) === 4) {
3054
+ return matr[0][0] + matr[1][1] + matr[2][2] + matr[3][3];
3055
+ }
3056
+ else {
3057
+ var result = 0;
3058
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
3059
+ result += matr[i][i];
3060
+ }
3061
+ return result;
1729
3062
  }
1730
- return result;
1731
3063
  }
1732
3064
  else {
1733
3065
  throw new TypeError('Parameter "matr" must be of type "ChalkboardMatrix" that is square.');
1734
3066
  }
1735
3067
  };
1736
3068
  matr_1.transpose = function (matr) {
1737
- var result = Chalkboard.matr.init();
1738
- for (var i = 0; i < Chalkboard.matr.cols(matr); i++) {
1739
- result[i] = [];
1740
- for (var j = 0; j < Chalkboard.matr.rows(matr); j++) {
1741
- result[i][j] = matr[j][i];
3069
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
3070
+ return Chalkboard.matr.init([matr[0][0], matr[1][0]], [matr[0][1], matr[1][1]]);
3071
+ }
3072
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
3073
+ return Chalkboard.matr.init([matr[0][0], matr[1][0], matr[2][0]], [matr[0][1], matr[1][1], matr[2][1]], [matr[0][2], matr[1][2], matr[2][2]]);
3074
+ }
3075
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
3076
+ return Chalkboard.matr.init([matr[0][0], matr[1][0], matr[2][0], matr[3][0]], [matr[0][1], matr[1][1], matr[2][1], matr[3][1]], [matr[0][2], matr[1][2], matr[2][2], matr[3][2]], [matr[0][3], matr[1][3], matr[2][3], matr[3][3]]);
3077
+ }
3078
+ else {
3079
+ var result = Chalkboard.matr.init();
3080
+ for (var i = 0; i < Chalkboard.matr.cols(matr); i++) {
3081
+ result[i] = [];
3082
+ for (var j = 0; j < Chalkboard.matr.rows(matr); j++) {
3083
+ result[i][j] = matr[j][i];
3084
+ }
1742
3085
  }
3086
+ return result;
1743
3087
  }
1744
- return result;
1745
3088
  };
1746
3089
  matr_1.translator = function (vect) {
1747
3090
  if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
@@ -1757,15 +3100,95 @@ var Chalkboard;
1757
3100
  throw new TypeError('Parameter "vect" must be of type "ChalkboardVector" with 2, 3, or 4 dimensions.');
1758
3101
  }
1759
3102
  };
3103
+ matr_1.upperBinomial = function (size) {
3104
+ if (size === 2) {
3105
+ return Chalkboard.matr.init([1, 1], [0, 1]);
3106
+ }
3107
+ else if (size === 3) {
3108
+ return Chalkboard.matr.init([1, 2, 1], [0, 1, 1], [0, 0, 1]);
3109
+ }
3110
+ else if (size === 4) {
3111
+ return Chalkboard.matr.init([1, 3, 3, 1], [0, 1, 2, 1], [0, 0, 1, 1], [0, 0, 0, 1]);
3112
+ }
3113
+ else {
3114
+ var result = Chalkboard.matr.init();
3115
+ for (var i = 0; i < size; i++) {
3116
+ result.push([]);
3117
+ for (var j = 0; j < size; j++) {
3118
+ result[i].push(Chalkboard.numb.binomial(j, i));
3119
+ }
3120
+ }
3121
+ return result;
3122
+ }
3123
+ };
3124
+ matr_1.upperShift = function (size) {
3125
+ if (size === 2) {
3126
+ return Chalkboard.matr.init([0, 1], [0, 0]);
3127
+ }
3128
+ else if (size === 3) {
3129
+ return Chalkboard.matr.init([0, 1, 0], [0, 0, 1], [0, 0, 0]);
3130
+ }
3131
+ else if (size === 4) {
3132
+ return Chalkboard.matr.init([0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [0, 0, 0, 0]);
3133
+ }
3134
+ else {
3135
+ var result = Chalkboard.matr.init();
3136
+ for (var i = 0; i < size; i++) {
3137
+ result[i] = [];
3138
+ for (var j = 0; j < size; j++) {
3139
+ result[i][j] = Chalkboard.numb.Kronecker(i + 1, j);
3140
+ }
3141
+ }
3142
+ return result;
3143
+ }
3144
+ };
3145
+ matr_1.upperTriangular = function (size) {
3146
+ var elements = [];
3147
+ for (var _i = 1; _i < arguments.length; _i++) {
3148
+ elements[_i - 1] = arguments[_i];
3149
+ }
3150
+ if (size === 2) {
3151
+ return Chalkboard.matr.init([elements[0] || 0, elements[1] || 0], [0, elements[2] || 0]);
3152
+ }
3153
+ else if (size === 3) {
3154
+ return Chalkboard.matr.init([elements[0] || 0, elements[1] || 0, elements[2] || 0], [0, elements[3] || 0, elements[4] || 0], [0, 0, elements[5] || 0]);
3155
+ }
3156
+ else if (size === 4) {
3157
+ return Chalkboard.matr.init([elements[0] || 0, elements[1] || 0, elements[2] || 0, elements[3] || 0], [0, elements[4] || 0, elements[5] || 0, elements[6] || 0], [0, 0, elements[7] || 0, elements[8] || 0], [0, 0, 0, elements[9] || 0]);
3158
+ }
3159
+ else {
3160
+ elements = Array.isArray(elements[0]) ? elements[0] : elements;
3161
+ var result = Chalkboard.matr.init();
3162
+ var index = 0;
3163
+ for (var i = 0; i < size; i++) {
3164
+ result[i] = [];
3165
+ for (var j = 0; j < size; j++) {
3166
+ result[i][j] = j >= i ? elements[index++] || 0 : 0;
3167
+ }
3168
+ }
3169
+ return result;
3170
+ }
3171
+ };
1760
3172
  matr_1.zero = function (matr) {
1761
- var result = Chalkboard.matr.init();
1762
- for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
1763
- result[i] = [];
1764
- for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
1765
- result[i][j] = matr[i][j] * 0;
3173
+ if (Chalkboard.matr.isSizeOf(matr, 2)) {
3174
+ return Chalkboard.matr.init([matr[0][0] * 0, matr[0][1] * 0], [matr[1][0] * 0, matr[1][1] * 0]);
3175
+ }
3176
+ else if (Chalkboard.matr.isSizeOf(matr, 3)) {
3177
+ return Chalkboard.matr.init([matr[0][0] * 0, matr[0][1] * 0, matr[0][2] * 0], [matr[1][0] * 0, matr[1][1] * 0, matr[1][2] * 0], [matr[2][0] * 0, matr[2][1] * 0, matr[2][2] * 0]);
3178
+ }
3179
+ else if (Chalkboard.matr.isSizeOf(matr, 4)) {
3180
+ return Chalkboard.matr.init([matr[0][0] * 0, matr[0][1] * 0, matr[0][2] * 0, matr[0][3] * 0], [matr[1][0] * 0, matr[1][1] * 0, matr[1][2] * 0, matr[1][3] * 0], [matr[2][0] * 0, matr[2][1] * 0, matr[2][2] * 0, matr[2][3] * 0], [matr[3][0] * 0, matr[3][1] * 0, matr[3][2] * 0, matr[3][3] * 0]);
3181
+ }
3182
+ else {
3183
+ var result = Chalkboard.matr.init();
3184
+ for (var i = 0; i < Chalkboard.matr.rows(matr); i++) {
3185
+ result[i] = [];
3186
+ for (var j = 0; j < Chalkboard.matr.cols(matr); j++) {
3187
+ result[i][j] = matr[i][j] * 0;
3188
+ }
1766
3189
  }
3190
+ return result;
1767
3191
  }
1768
- return result;
1769
3192
  };
1770
3193
  })(matr = Chalkboard.matr || (Chalkboard.matr = {}));
1771
3194
  })(Chalkboard || (Chalkboard = {}));
@@ -1775,9 +3198,6 @@ var Chalkboard;
1775
3198
  (function (numb) {
1776
3199
  numb.Bernoullian = function (p) {
1777
3200
  if (p === void 0) { p = 0.5; }
1778
- if (p === undefined) {
1779
- p = 0.5;
1780
- }
1781
3201
  return Math.random() < p ? 1 : 0;
1782
3202
  };
1783
3203
  numb.binomial = function (n, k) {
@@ -1914,6 +3334,10 @@ var Chalkboard;
1914
3334
  return undefined;
1915
3335
  }
1916
3336
  };
3337
+ numb.isApproxEqual = function (a, b, precision) {
3338
+ if (precision === void 0) { precision = 0.000001; }
3339
+ return Math.abs(a - b) < precision;
3340
+ };
1917
3341
  numb.isPrime = function (num) {
1918
3342
  for (var i = 2; i <= Chalkboard.real.sqrt(num); i++) {
1919
3343
  if (num % i === 0) {
@@ -1936,6 +3360,9 @@ var Chalkboard;
1936
3360
  numb.map = function (num, range1, range2) {
1937
3361
  return range2[0] + (range2[1] - range2[0]) * ((num - range1[0]) / (range1[1] - range1[0]));
1938
3362
  };
3363
+ numb.mod = function (a, b) {
3364
+ return ((a % b) + b) % b;
3365
+ };
1939
3366
  numb.mul = function (formula, inf, sup) {
1940
3367
  var result = 1;
1941
3368
  var f = Chalkboard.real.parse("n => " + formula);
@@ -2017,6 +3444,9 @@ var Chalkboard;
2017
3444
  if (sup === void 0) { sup = 1; }
2018
3445
  return inf + (sup - inf) * Math.random();
2019
3446
  };
3447
+ numb.roundTo = function (num, positionalIndex) {
3448
+ return Math.round(num / positionalIndex) * positionalIndex;
3449
+ };
2020
3450
  numb.sgn = function (num) {
2021
3451
  if (num > 0) {
2022
3452
  return 1;
@@ -2999,6 +4429,9 @@ var Chalkboard;
2999
4429
  quat_1.toArray = function (quat) {
3000
4430
  return [quat.a, quat.b, quat.c, quat.d];
3001
4431
  };
4432
+ quat_1.toMatrix = function (quat) {
4433
+ return Chalkboard.matr.init([quat.a, -quat.b, -quat.c, -quat.d], [quat.b, quat.a, -quat.d, quat.c], [quat.c, quat.d, quat.a, -quat.b], [quat.d, -quat.c, quat.b, quat.a]);
4434
+ };
3002
4435
  quat_1.toRotation = function (quat, vect) {
3003
4436
  var vector = Chalkboard.vect.toQuaternion(vect);
3004
4437
  var inverse = Chalkboard.quat.invert(quat);
@@ -3750,9 +5183,7 @@ var Chalkboard;
3750
5183
  for (var _i = 0; _i < arguments.length; _i++) {
3751
5184
  size[_i] = arguments[_i];
3752
5185
  }
3753
- if (Array.isArray(size[0])) {
3754
- size = size[0];
3755
- }
5186
+ size = Array.isArray(size[0]) ? size[0] : size;
3756
5187
  var newNDArray = function (size) {
3757
5188
  if (size.length === 0) {
3758
5189
  return null;
@@ -3772,9 +5203,7 @@ var Chalkboard;
3772
5203
  for (var _i = 1; _i < arguments.length; _i++) {
3773
5204
  size[_i - 1] = arguments[_i];
3774
5205
  }
3775
- if (Array.isArray(size[0])) {
3776
- size = size[0];
3777
- }
5206
+ size = Array.isArray(size[0]) ? size[0] : size;
3778
5207
  var newNDArray = function (size) {
3779
5208
  if (size.length === 0) {
3780
5209
  return element;
@@ -3815,6 +5244,61 @@ var Chalkboard;
3815
5244
  };
3816
5245
  return newNDArray(tensor);
3817
5246
  };
5247
+ tens_1.isEqual = function (tens1, tens2) {
5248
+ if (Chalkboard.tens.isSizeEqual(tens1, tens2)) {
5249
+ (tens1 = tens1), (tens2 = tens2);
5250
+ for (var i = 0; i < tens1.length; i++) {
5251
+ if (Array.isArray(tens1[i]) && Array.isArray(tens2[i])) {
5252
+ if (!Chalkboard.tens.isEqual(tens1[i], tens2[i]))
5253
+ return false;
5254
+ }
5255
+ else {
5256
+ if (tens1[i] !== tens2[i])
5257
+ return false;
5258
+ }
5259
+ }
5260
+ return true;
5261
+ }
5262
+ else {
5263
+ return false;
5264
+ }
5265
+ };
5266
+ tens_1.isRankEqual = function (tens1, tens2) {
5267
+ return Chalkboard.tens.rank(tens1) === Chalkboard.tens.rank(tens2);
5268
+ };
5269
+ tens_1.isRankOf = function (tens, rank) {
5270
+ return Chalkboard.tens.rank(tens) === rank;
5271
+ };
5272
+ tens_1.isSizeEqual = function (tens1, tens2) {
5273
+ if (Chalkboard.tens.isRankEqual(tens1, tens2)) {
5274
+ var score = 0;
5275
+ for (var i = 0; i < Chalkboard.tens.rank(tens1); i++) {
5276
+ if (Chalkboard.tens.size(tens1)[i] !== Chalkboard.tens.size(tens2)[i])
5277
+ score++;
5278
+ }
5279
+ return score === 0;
5280
+ }
5281
+ else {
5282
+ return false;
5283
+ }
5284
+ };
5285
+ tens_1.isSizeOf = function (tens) {
5286
+ var _a;
5287
+ var size = [];
5288
+ for (var _i = 1; _i < arguments.length; _i++) {
5289
+ size[_i - 1] = arguments[_i];
5290
+ }
5291
+ size = Array.isArray(size[0]) ? size[0] : size;
5292
+ return Chalkboard.tens.isSizeEqual(tens, (_a = Chalkboard.tens).empty.apply(_a, size));
5293
+ };
5294
+ tens_1.isSizeUniform = function (tens) {
5295
+ var score = 0;
5296
+ for (var i = 0; i < Chalkboard.tens.rank(tens); i++) {
5297
+ if (Chalkboard.tens.size(tens)[i] !== Chalkboard.tens.size(tens)[0])
5298
+ score++;
5299
+ }
5300
+ return score === 0;
5301
+ };
3818
5302
  tens_1.mul = function (tens1, tens2) {
3819
5303
  var result = Chalkboard.tens.init();
3820
5304
  if (Array.isArray(tens1) && Array.isArray(tens2)) {
@@ -3877,9 +5361,7 @@ var Chalkboard;
3877
5361
  for (var _i = 2; _i < arguments.length; _i++) {
3878
5362
  size[_i - 2] = arguments[_i];
3879
5363
  }
3880
- if (Array.isArray(size[0])) {
3881
- size = size[0];
3882
- }
5364
+ size = Array.isArray(size[0]) ? size[0] : size;
3883
5365
  var newNDArray = function (size) {
3884
5366
  if (size.length === 0) {
3885
5367
  return Chalkboard.numb.random(inf, sup);
@@ -3895,16 +5377,7 @@ var Chalkboard;
3895
5377
  return newNDArray(size);
3896
5378
  };
3897
5379
  tens_1.rank = function (tens) {
3898
- if (Array.isArray(tens)) {
3899
- var result = 0;
3900
- for (var i = 0; i < tens.length; i++) {
3901
- result = Math.max(result, Chalkboard.tens.rank(tens[i]));
3902
- }
3903
- return result + 1;
3904
- }
3905
- else {
3906
- return 0;
3907
- }
5380
+ return Chalkboard.tens.size(tens).length;
3908
5381
  };
3909
5382
  tens_1.reciprocate = function (tens) {
3910
5383
  var result = Chalkboard.tens.init();
@@ -3924,9 +5397,7 @@ var Chalkboard;
3924
5397
  for (var _i = 1; _i < arguments.length; _i++) {
3925
5398
  size[_i - 1] = arguments[_i];
3926
5399
  }
3927
- if (Array.isArray(size[0])) {
3928
- size = size[0];
3929
- }
5400
+ size = Array.isArray(size[0]) ? size[0] : size;
3930
5401
  var result = (_a = Chalkboard.tens).fill.apply(_a, __spreadArray([0], size, false));
3931
5402
  var refill = function (arr1, arr2) {
3932
5403
  for (var i = 0; i < arr2.length; i++) {
@@ -4310,13 +5781,13 @@ var Chalkboard;
4310
5781
  var vect;
4311
5782
  (function (vect_3) {
4312
5783
  vect_3.absolute = function (vect) {
4313
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
5784
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4314
5785
  return Chalkboard.vect.init(Math.abs(vect.x), Math.abs(vect.y));
4315
5786
  }
4316
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
5787
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4317
5788
  return Chalkboard.vect.init(Math.abs(vect.x), Math.abs(vect.y), Math.abs(vect.z));
4318
5789
  }
4319
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
5790
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4320
5791
  return Chalkboard.vect.init(Math.abs(vect.x), Math.abs(vect.y), Math.abs(vect.z), Math.abs(vect.w));
4321
5792
  }
4322
5793
  else {
@@ -4324,34 +5795,13 @@ var Chalkboard;
4324
5795
  }
4325
5796
  };
4326
5797
  vect_3.add = function (vect1, vect2) {
4327
- if (typeof vect1.x === "number" &&
4328
- typeof vect1.y === "number" &&
4329
- typeof vect1.z === "undefined" &&
4330
- typeof vect1.w === "undefined" &&
4331
- typeof vect2.x === "number" &&
4332
- typeof vect2.y === "number" &&
4333
- typeof vect2.z === "undefined" &&
4334
- typeof vect2.w === "undefined") {
5798
+ if (Chalkboard.vect.isDimensionOf(vect1, 2) && Chalkboard.vect.isDimensionOf(vect2, 2)) {
4335
5799
  return Chalkboard.vect.init(vect1.x + vect2.x, vect1.y + vect2.y);
4336
5800
  }
4337
- else if (typeof vect1.x === "number" &&
4338
- typeof vect1.y === "number" &&
4339
- typeof vect1.z === "number" &&
4340
- typeof vect1.w === "undefined" &&
4341
- typeof vect2.x === "number" &&
4342
- typeof vect2.y === "number" &&
4343
- typeof vect2.z === "number" &&
4344
- typeof vect2.w === "undefined") {
5801
+ else if (Chalkboard.vect.isDimensionOf(vect1, 3) && Chalkboard.vect.isDimensionOf(vect2, 3)) {
4345
5802
  return Chalkboard.vect.init(vect1.x + vect2.x, vect1.y + vect2.y, vect1.z + vect2.z);
4346
5803
  }
4347
- else if (typeof vect1.x === "number" &&
4348
- typeof vect1.y === "number" &&
4349
- typeof vect1.z === "number" &&
4350
- typeof vect1.w === "number" &&
4351
- typeof vect2.x === "number" &&
4352
- typeof vect2.y === "number" &&
4353
- typeof vect2.z === "number" &&
4354
- typeof vect2.w === "number") {
5804
+ else if (Chalkboard.vect.isDimensionOf(vect1, 4) && Chalkboard.vect.isDimensionOf(vect2, 4)) {
4355
5805
  return Chalkboard.vect.init(vect1.x + vect2.x, vect1.y + vect2.y, vect1.z + vect2.z, vect1.w + vect2.w);
4356
5806
  }
4357
5807
  else {
@@ -4359,13 +5809,13 @@ var Chalkboard;
4359
5809
  }
4360
5810
  };
4361
5811
  vect_3.ang = function (vect) {
4362
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
5812
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4363
5813
  return Chalkboard.trig.arctan2(vect.y, vect.x);
4364
5814
  }
4365
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
5815
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4366
5816
  return [Math.acos(vect.x / Chalkboard.vect.mag(vect)), Math.acos(vect.y / Chalkboard.vect.mag(vect)), Math.acos(vect.z / Chalkboard.vect.mag(vect))];
4367
5817
  }
4368
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
5818
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4369
5819
  return [
4370
5820
  Math.acos(vect.x / Chalkboard.vect.mag(vect)),
4371
5821
  Math.acos(vect.y / Chalkboard.vect.mag(vect)),
@@ -4382,13 +5832,13 @@ var Chalkboard;
4382
5832
  };
4383
5833
  vect_3.constrain = function (vect, range) {
4384
5834
  if (range === void 0) { range = [0, 1]; }
4385
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
5835
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4386
5836
  return Chalkboard.vect.init(Chalkboard.numb.constrain(vect.x, range), Chalkboard.numb.constrain(vect.y, range));
4387
5837
  }
4388
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
5838
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4389
5839
  return Chalkboard.vect.init(Chalkboard.numb.constrain(vect.x, range), Chalkboard.numb.constrain(vect.y, range), Chalkboard.numb.constrain(vect.z, range));
4390
5840
  }
4391
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
5841
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4392
5842
  return Chalkboard.vect.init(Chalkboard.numb.constrain(vect.x, range), Chalkboard.numb.constrain(vect.y, range), Chalkboard.numb.constrain(vect.z, range), Chalkboard.numb.constrain(vect.w, range));
4393
5843
  }
4394
5844
  else {
@@ -4399,24 +5849,10 @@ var Chalkboard;
4399
5849
  return Object.create(Object.getPrototypeOf(vect), Object.getOwnPropertyDescriptors(vect));
4400
5850
  };
4401
5851
  vect_3.cross = function (vect1, vect2) {
4402
- if (typeof vect1.x === "number" &&
4403
- typeof vect1.y === "number" &&
4404
- typeof vect1.z === "undefined" &&
4405
- typeof vect1.w === "undefined" &&
4406
- typeof vect2.x === "number" &&
4407
- typeof vect2.y === "number" &&
4408
- typeof vect2.z === "undefined" &&
4409
- typeof vect2.w === "undefined") {
5852
+ if (Chalkboard.vect.isDimensionOf(vect1, 2) && Chalkboard.vect.isDimensionOf(vect2, 2)) {
4410
5853
  return Chalkboard.vect.init(0, 0, vect1.x * vect2.y - vect1.y * vect2.x);
4411
5854
  }
4412
- else if (typeof vect1.x === "number" &&
4413
- typeof vect1.y === "number" &&
4414
- typeof vect1.z === "number" &&
4415
- typeof vect1.w === "undefined" &&
4416
- typeof vect2.x === "number" &&
4417
- typeof vect2.y === "number" &&
4418
- typeof vect2.z === "number" &&
4419
- typeof vect2.w === "undefined") {
5855
+ else if (Chalkboard.vect.isDimensionOf(vect1, 3) && Chalkboard.vect.isDimensionOf(vect2, 3)) {
4420
5856
  return Chalkboard.vect.init(vect1.y * vect2.z - vect1.z * vect2.y, vect1.z * vect2.x - vect1.x * vect2.z, vect1.x * vect2.y - vect1.y * vect2.x);
4421
5857
  }
4422
5858
  else {
@@ -4443,104 +5879,47 @@ var Chalkboard;
4443
5879
  }
4444
5880
  };
4445
5881
  vect_3.dist = function (vect1, vect2) {
4446
- if (typeof vect1.x === "number" &&
4447
- typeof vect1.y === "number" &&
4448
- typeof vect1.z === "undefined" &&
4449
- typeof vect1.w === "undefined" &&
4450
- typeof vect2.x === "number" &&
4451
- typeof vect2.y === "number" &&
4452
- typeof vect2.z === "undefined" &&
4453
- typeof vect2.w === "undefined") {
5882
+ if (Chalkboard.vect.isDimensionOf(vect1, 2) && Chalkboard.vect.isDimensionOf(vect2, 2)) {
4454
5883
  return Chalkboard.real.sqrt((vect2.x - vect1.x) * (vect2.x - vect1.x) + (vect2.y - vect1.y) * (vect2.y - vect1.y));
4455
5884
  }
4456
- else if (typeof vect1.x === "number" &&
4457
- typeof vect1.y === "number" &&
4458
- typeof vect1.z === "number" &&
4459
- typeof vect1.w === "undefined" &&
4460
- typeof vect2.x === "number" &&
4461
- typeof vect2.y === "number" &&
4462
- typeof vect2.z === "number" &&
4463
- typeof vect2.w === "undefined") {
5885
+ else if (Chalkboard.vect.isDimensionOf(vect1, 3) && Chalkboard.vect.isDimensionOf(vect2, 3)) {
4464
5886
  return Chalkboard.real.sqrt((vect2.x - vect1.x) * (vect2.x - vect1.x) + (vect2.y - vect1.y) * (vect2.y - vect1.y) + (vect2.z - vect1.z) * (vect2.z - vect1.z));
4465
5887
  }
4466
- else if (typeof vect1.x === "number" &&
4467
- typeof vect1.y === "number" &&
4468
- typeof vect1.z === "number" &&
4469
- typeof vect1.w === "number" &&
4470
- typeof vect2.x === "number" &&
4471
- typeof vect2.y === "number" &&
4472
- typeof vect2.z === "number" &&
4473
- typeof vect2.w === "number") {
4474
- return Chalkboard.real.sqrt((vect2.x - vect1.x) * (vect2.x - vect1.x) + (vect2.y - vect1.y) * (vect2.y - vect1.y) + (vect2.z - vect1.z) * (vect2.z - vect1.z) + (vect2.w - vect1.w) * (vect2.w - vect1.w));
5888
+ else if (Chalkboard.vect.isDimensionOf(vect1, 4) && Chalkboard.vect.isDimensionOf(vect2, 4)) {
5889
+ return Chalkboard.real.sqrt((vect2.x - vect1.x) * (vect2.x - vect1.x) +
5890
+ (vect2.y - vect1.y) * (vect2.y - vect1.y) +
5891
+ (vect2.z - vect1.z) * (vect2.z - vect1.z) +
5892
+ (vect2.w - vect1.w) * (vect2.w - vect1.w));
4475
5893
  }
4476
5894
  else {
4477
5895
  throw new TypeError('Parameters "vect1" and "vect2" must be of type "ChalkboardVector" with 2, 3, or 4 dimensions.');
4478
5896
  }
4479
5897
  };
4480
5898
  vect_3.distsq = function (vect1, vect2) {
4481
- if (typeof vect1.x === "number" &&
4482
- typeof vect1.y === "number" &&
4483
- typeof vect1.z === "undefined" &&
4484
- typeof vect1.w === "undefined" &&
4485
- typeof vect2.x === "number" &&
4486
- typeof vect2.y === "number" &&
4487
- typeof vect2.z === "undefined" &&
4488
- typeof vect2.w === "undefined") {
5899
+ if (Chalkboard.vect.isDimensionOf(vect1, 2) && Chalkboard.vect.isDimensionOf(vect2, 2)) {
4489
5900
  return (vect2.x - vect1.x) * (vect2.x - vect1.x) + (vect2.y - vect1.y) * (vect2.y - vect1.y);
4490
5901
  }
4491
- else if (typeof vect1.x === "number" &&
4492
- typeof vect1.y === "number" &&
4493
- typeof vect1.z === "number" &&
4494
- typeof vect1.w === "undefined" &&
4495
- typeof vect2.x === "number" &&
4496
- typeof vect2.y === "number" &&
4497
- typeof vect2.z === "number" &&
4498
- typeof vect2.w === "undefined") {
5902
+ else if (Chalkboard.vect.isDimensionOf(vect1, 3) && Chalkboard.vect.isDimensionOf(vect2, 3)) {
4499
5903
  return (vect2.x - vect1.x) * (vect2.x - vect1.x) + (vect2.y - vect1.y) * (vect2.y - vect1.y) + (vect2.z - vect1.z) * (vect2.z - vect1.z);
4500
5904
  }
4501
- else if (typeof vect1.x === "number" &&
4502
- typeof vect1.y === "number" &&
4503
- typeof vect1.z === "number" &&
4504
- typeof vect1.w === "number" &&
4505
- typeof vect2.x === "number" &&
4506
- typeof vect2.y === "number" &&
4507
- typeof vect2.z === "number" &&
4508
- typeof vect2.w === "number") {
4509
- return (vect2.x - vect1.x) * (vect2.x - vect1.x) + (vect2.y - vect1.y) * (vect2.y - vect1.y) + (vect2.z - vect1.z) * (vect2.z - vect1.z) + (vect2.w - vect1.w) * (vect2.w - vect1.w);
5905
+ else if (Chalkboard.vect.isDimensionOf(vect1, 4) && Chalkboard.vect.isDimensionOf(vect2, 4)) {
5906
+ return ((vect2.x - vect1.x) * (vect2.x - vect1.x) +
5907
+ (vect2.y - vect1.y) * (vect2.y - vect1.y) +
5908
+ (vect2.z - vect1.z) * (vect2.z - vect1.z) +
5909
+ (vect2.w - vect1.w) * (vect2.w - vect1.w));
4510
5910
  }
4511
5911
  else {
4512
5912
  throw new TypeError('Parameters "vect1" and "vect2" must be of type "ChalkboardVector" with 2, 3, or 4 dimensions.');
4513
5913
  }
4514
5914
  };
4515
5915
  vect_3.dot = function (vect1, vect2) {
4516
- if (typeof vect1.x === "number" &&
4517
- typeof vect1.y === "number" &&
4518
- typeof vect1.z === "undefined" &&
4519
- typeof vect1.w === "undefined" &&
4520
- typeof vect2.x === "number" &&
4521
- typeof vect2.y === "number" &&
4522
- typeof vect2.z === "undefined" &&
4523
- typeof vect2.w === "undefined") {
5916
+ if (Chalkboard.vect.isDimensionOf(vect1, 2) && Chalkboard.vect.isDimensionOf(vect2, 2)) {
4524
5917
  return vect1.x * vect2.x + vect1.y * vect2.y;
4525
5918
  }
4526
- else if (typeof vect1.x === "number" &&
4527
- typeof vect1.y === "number" &&
4528
- typeof vect1.z === "number" &&
4529
- typeof vect1.w === "undefined" &&
4530
- typeof vect2.x === "number" &&
4531
- typeof vect2.y === "number" &&
4532
- typeof vect2.z === "number" &&
4533
- typeof vect2.w === "undefined") {
5919
+ else if (Chalkboard.vect.isDimensionOf(vect1, 3) && Chalkboard.vect.isDimensionOf(vect2, 3)) {
4534
5920
  return vect1.x * vect2.x + vect1.y * vect2.y + vect1.z * vect2.z;
4535
5921
  }
4536
- else if (typeof vect1.x === "number" &&
4537
- typeof vect1.y === "number" &&
4538
- typeof vect1.z === "number" &&
4539
- typeof vect1.w === "number" &&
4540
- typeof vect2.x === "number" &&
4541
- typeof vect2.y === "number" &&
4542
- typeof vect2.z === "number" &&
4543
- typeof vect2.w === "number") {
5922
+ else if (Chalkboard.vect.isDimensionOf(vect1, 4) && Chalkboard.vect.isDimensionOf(vect2, 4)) {
4544
5923
  return vect1.x * vect2.x + vect1.y * vect2.y + vect1.z * vect2.z + vect1.w * vect2.w;
4545
5924
  }
4546
5925
  else {
@@ -4588,16 +5967,16 @@ var Chalkboard;
4588
5967
  }
4589
5968
  };
4590
5969
  vect_3.fromAlternateToCartesian = function (vect, type) {
4591
- if (type === "polar" && typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
5970
+ if (type === "polar" && Chalkboard.vect.isDimensionOf(vect, 2)) {
4592
5971
  return Chalkboard.vect.init(vect.x * Chalkboard.trig.cos(vect.y), vect.y * Chalkboard.trig.sin(vect.y));
4593
5972
  }
4594
- else if (type === "bipolar" && typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
5973
+ else if (type === "bipolar" && Chalkboard.vect.isDimensionOf(vect, 2)) {
4595
5974
  return Chalkboard.vect.init((vect.x * vect.x - vect.y * vect.y) / 4, Chalkboard.real.sqrt(16 * vect.x * vect.x - (vect.x * vect.x - vect.y * vect.y + 4) * (vect.x * vect.x - vect.y * vect.y + 4)));
4596
5975
  }
4597
- else if (type === "cylindrical" && typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
5976
+ else if (type === "cylindrical" && Chalkboard.vect.isDimensionOf(vect, 3)) {
4598
5977
  return Chalkboard.vect.init(vect.x * Chalkboard.trig.cos(vect.y), vect.x * Chalkboard.trig.sin(vect.y), vect.z);
4599
5978
  }
4600
- else if (type === "spherical" && typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
5979
+ else if (type === "spherical" && Chalkboard.vect.isDimensionOf(vect, 3)) {
4601
5980
  return Chalkboard.vect.init(vect.x * Chalkboard.trig.sin(vect.z) * Chalkboard.trig.cos(vect.y), vect.x * Chalkboard.trig.sin(vect.z) * Chalkboard.trig.sin(vect.y), vect.x * Chalkboard.trig.cos(vect.z));
4602
5981
  }
4603
5982
  else {
@@ -4613,16 +5992,16 @@ var Chalkboard;
4613
5992
  }
4614
5993
  };
4615
5994
  vect_3.fromCartesianToAlternate = function (vect, type) {
4616
- if (type === "polar" && typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
5995
+ if (type === "polar" && Chalkboard.vect.isDimensionOf(vect, 2)) {
4617
5996
  return Chalkboard.vect.init(Chalkboard.vect.mag(vect), Chalkboard.vect.ang(vect));
4618
5997
  }
4619
- else if (type === "bipolar" && typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
5998
+ else if (type === "bipolar" && Chalkboard.vect.isDimensionOf(vect, 2)) {
4620
5999
  return Chalkboard.vect.init((vect.x + 1) * (vect.x + 1) + vect.y * vect.y, (vect.x - 1) * (vect.x - 1) + vect.y * vect.y);
4621
6000
  }
4622
- else if (type === "cylindrical" && typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6001
+ else if (type === "cylindrical" && Chalkboard.vect.isDimensionOf(vect, 3)) {
4623
6002
  return Chalkboard.vect.init(Chalkboard.vect.mag(Chalkboard.vect.init(vect.x, vect.y)), Chalkboard.vect.ang(Chalkboard.vect.init(vect.x, vect.y)), vect.z);
4624
6003
  }
4625
- else if (type === "spherical" && typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6004
+ else if (type === "spherical" && Chalkboard.vect.isDimensionOf(vect, 3)) {
4626
6005
  return Chalkboard.vect.init(Chalkboard.vect.mag(vect), Chalkboard.vect.ang(Chalkboard.vect.init(vect.x, vect.y)), Chalkboard.vect.ang(vect)[2]);
4627
6006
  }
4628
6007
  else {
@@ -4630,15 +6009,15 @@ var Chalkboard;
4630
6009
  }
4631
6010
  };
4632
6011
  vect_3.fromField = function (vectfield, vect) {
4633
- if (Chalkboard.vect.dimension(vectfield) === 2 && typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
6012
+ if (Chalkboard.vect.dimension(vectfield) === 2 && Chalkboard.vect.isDimensionOf(vect, 2)) {
4634
6013
  var p = Chalkboard.real.parse("(x, y) => " + vectfield.p), q = Chalkboard.real.parse("(x, y) => " + vectfield.q);
4635
6014
  return Chalkboard.vect.init(p(vect.x, vect.y), q(vect.x, vect.y));
4636
6015
  }
4637
- else if (Chalkboard.vect.dimension(vectfield) === 3 && typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6016
+ else if (Chalkboard.vect.dimension(vectfield) === 3 && Chalkboard.vect.isDimensionOf(vect, 3)) {
4638
6017
  var p = Chalkboard.real.parse("(x, y, z) => " + vectfield.p), q = Chalkboard.real.parse("(x, y, z) => " + vectfield.q), r = Chalkboard.real.parse("(x, y, z) => " + vectfield.r);
4639
6018
  return Chalkboard.vect.init(p(vect.x, vect.y, vect.z), q(vect.x, vect.y, vect.z), r(vect.x, vect.y, vect.z));
4640
6019
  }
4641
- else if (Chalkboard.vect.dimension(vectfield) === 4 && typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
6020
+ else if (Chalkboard.vect.dimension(vectfield) === 4 && Chalkboard.vect.isDimensionOf(vect, 4)) {
4642
6021
  var p = Chalkboard.real.parse("(x, y, z, w) => " + vectfield.p), q = Chalkboard.real.parse("(x, y, z, w) => " + vectfield.q), r = Chalkboard.real.parse("(x, y, z, w) => " + vectfield.r), s = Chalkboard.real.parse("(x, y, z, w) => " + vectfield.s);
4643
6022
  return Chalkboard.vect.init(p(vect.x, vect.y, vect.z, vect.w), q(vect.x, vect.y, vect.z, vect.w), r(vect.x, vect.y, vect.z, vect.w), s(vect.x, vect.y, vect.z, vect.w));
4644
6023
  }
@@ -4647,13 +6026,13 @@ var Chalkboard;
4647
6026
  }
4648
6027
  };
4649
6028
  vect_3.fromVector = function (vect) {
4650
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
6029
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4651
6030
  return Chalkboard.vect.init(vect.x, vect.y, 0);
4652
6031
  }
4653
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6032
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4654
6033
  return Chalkboard.vect.init(vect.x, vect.y, vect.z, 0);
4655
6034
  }
4656
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
6035
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4657
6036
  return Chalkboard.vect.init(vect.x, vect.y);
4658
6037
  }
4659
6038
  else {
@@ -4672,27 +6051,75 @@ var Chalkboard;
4672
6051
  }
4673
6052
  };
4674
6053
  vect_3.interp = function (vect, a, b, c, d) {
4675
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined" && typeof c === "undefined" && typeof d === "undefined") {
6054
+ if (Chalkboard.vect.isDimensionOf(vect, 2) && typeof c === "undefined" && typeof d === "undefined") {
4676
6055
  return Chalkboard.vect.init((a * vect.x + b * vect.y) / (a + b), (a * vect.x + b * vect.y) / (a + b));
4677
6056
  }
4678
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined" && typeof c === "number" && typeof d === "undefined") {
6057
+ else if (Chalkboard.vect.isDimensionOf(vect, 3) && typeof c === "number" && typeof d === "undefined") {
4679
6058
  return Chalkboard.vect.init((a * vect.x + b * vect.y + c * vect.z) / (a + b + c), (a * vect.x + b * vect.y + c * vect.z) / (a + b + c), (a * vect.x + b * vect.y + c * vect.z) / (a + b + c));
4680
6059
  }
4681
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number" && typeof c === "number" && typeof d === "number") {
6060
+ else if (Chalkboard.vect.isDimensionOf(vect, 4) && typeof c === "number" && typeof d === "number") {
4682
6061
  return Chalkboard.vect.init((a * vect.x + b * vect.y + c * vect.z + d * vect.w) / (a + b + c + d), (a * vect.x + b * vect.y + c * vect.z + d * vect.w) / (a + b + c + d), (a * vect.x + b * vect.y + c * vect.z + d * vect.w) / (a + b + c + d), (a * vect.x + b * vect.y + c * vect.z + d * vect.w) / (a + b + c + d));
4683
6062
  }
4684
6063
  else {
4685
6064
  throw new TypeError('Parameter "vect" must be of type "ChalkboardVector" with 2, 3, or 4 dimensions.');
4686
6065
  }
4687
6066
  };
6067
+ vect_3.isDimensionEqual = function (vect1, vect2) {
6068
+ return Chalkboard.vect.dimension(vect1) === Chalkboard.vect.dimension(vect2);
6069
+ };
6070
+ vect_3.isDimensionOf = function (vectORvectfield, dimension) {
6071
+ if (dimension === 2) {
6072
+ return Chalkboard.vect.dimension(vectORvectfield) === 2;
6073
+ }
6074
+ else if (dimension === 3) {
6075
+ return Chalkboard.vect.dimension(vectORvectfield) === 3;
6076
+ }
6077
+ else if (dimension === 4) {
6078
+ return Chalkboard.vect.dimension(vectORvectfield) === 4;
6079
+ }
6080
+ else {
6081
+ throw new TypeError('Parameter "dimension" must be 2, 3, or 4.');
6082
+ }
6083
+ };
6084
+ vect_3.isEqual = function (vect1, vect2) {
6085
+ if (Chalkboard.vect.isDimensionEqual(vect1, vect2)) {
6086
+ if (Chalkboard.vect.isDimensionOf(vect1, 2)) {
6087
+ return vect1.x === vect2.x && vect1.y === vect2.y;
6088
+ }
6089
+ else if (Chalkboard.vect.isDimensionOf(vect1, 3)) {
6090
+ return vect1.x === vect2.x && vect1.y === vect2.y && vect1.z === vect2.z;
6091
+ }
6092
+ else if (Chalkboard.vect.isDimensionOf(vect1, 4)) {
6093
+ return vect1.x === vect2.x && vect1.y === vect2.y && vect1.z === vect2.z && vect1.w === vect2.w;
6094
+ }
6095
+ else {
6096
+ throw new TypeError('Parameters "vect1" and "vect2" must be of type "ChalkboardVector" with 2, 3, or 4 dimensions.');
6097
+ }
6098
+ }
6099
+ else {
6100
+ return false;
6101
+ }
6102
+ };
6103
+ vect_3.isNormalized = function (vect) {
6104
+ return Chalkboard.vect.magsq(vect) === 1;
6105
+ };
6106
+ vect_3.isOrthogonal = function (vect1, vect2) {
6107
+ return Chalkboard.vect.dot(vect1, vect2) === 0;
6108
+ };
6109
+ vect_3.isParallel = function (vect1, vect2) {
6110
+ return Chalkboard.numb.isApproxEqual(Chalkboard.vect.dot(vect1, vect2), Chalkboard.vect.mag(vect1) * Chalkboard.vect.mag(vect2));
6111
+ };
6112
+ vect_3.isZero = function (vect) {
6113
+ return Chalkboard.vect.isEqual(vect, Chalkboard.vect.zero(vect));
6114
+ };
4688
6115
  vect_3.mag = function (vect) {
4689
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
6116
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4690
6117
  return Chalkboard.real.sqrt(vect.x * vect.x + vect.y * vect.y);
4691
6118
  }
4692
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6119
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4693
6120
  return Chalkboard.real.sqrt(vect.x * vect.x + vect.y * vect.y + vect.z * vect.z);
4694
6121
  }
4695
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
6122
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4696
6123
  return Chalkboard.real.sqrt(vect.x * vect.x + vect.y * vect.y + vect.z * vect.z + vect.w * vect.w);
4697
6124
  }
4698
6125
  else {
@@ -4703,13 +6130,13 @@ var Chalkboard;
4703
6130
  return Chalkboard.vect.scl(Chalkboard.vect.normalize(vect), num);
4704
6131
  };
4705
6132
  vect_3.magsq = function (vect) {
4706
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
6133
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4707
6134
  return vect.x * vect.x + vect.y * vect.y;
4708
6135
  }
4709
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6136
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4710
6137
  return vect.x * vect.x + vect.y * vect.y + vect.z * vect.z;
4711
6138
  }
4712
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
6139
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4713
6140
  return vect.x * vect.x + vect.y * vect.y + vect.z * vect.z + vect.w * vect.w;
4714
6141
  }
4715
6142
  else {
@@ -4717,13 +6144,13 @@ var Chalkboard;
4717
6144
  }
4718
6145
  };
4719
6146
  vect_3.negate = function (vect) {
4720
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
6147
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4721
6148
  return Chalkboard.vect.init(-vect.x, -vect.y);
4722
6149
  }
4723
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6150
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4724
6151
  return Chalkboard.vect.init(-vect.x, -vect.y, -vect.z);
4725
6152
  }
4726
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
6153
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4727
6154
  return Chalkboard.vect.init(-vect.x, -vect.y, -vect.z, -vect.w);
4728
6155
  }
4729
6156
  else {
@@ -4731,13 +6158,13 @@ var Chalkboard;
4731
6158
  }
4732
6159
  };
4733
6160
  vect_3.normalize = function (vect) {
4734
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
6161
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4735
6162
  return Chalkboard.vect.init(vect.x / Chalkboard.vect.mag(vect), vect.y / Chalkboard.vect.mag(vect));
4736
6163
  }
4737
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6164
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4738
6165
  return Chalkboard.vect.init(vect.x / Chalkboard.vect.mag(vect), vect.y / Chalkboard.vect.mag(vect), vect.z / Chalkboard.vect.mag(vect));
4739
6166
  }
4740
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
6167
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4741
6168
  return Chalkboard.vect.init(vect.x / Chalkboard.vect.mag(vect), vect.y / Chalkboard.vect.mag(vect), vect.z / Chalkboard.vect.mag(vect), vect.w / Chalkboard.vect.mag(vect));
4742
6169
  }
4743
6170
  else {
@@ -4768,13 +6195,13 @@ var Chalkboard;
4768
6195
  }
4769
6196
  };
4770
6197
  vect_3.reciprocate = function (vect) {
4771
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
6198
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4772
6199
  return Chalkboard.vect.init(1 / vect.x, 1 / vect.y);
4773
6200
  }
4774
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6201
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4775
6202
  return Chalkboard.vect.init(1 / vect.x, 1 / vect.y, 1 / vect.z);
4776
6203
  }
4777
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
6204
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4778
6205
  return Chalkboard.vect.init(1 / vect.x, 1 / vect.y, 1 / vect.z, 1 / vect.w);
4779
6206
  }
4780
6207
  else {
@@ -4795,13 +6222,13 @@ var Chalkboard;
4795
6222
  }
4796
6223
  };
4797
6224
  vect_3.round = function (vect) {
4798
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
6225
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4799
6226
  return Chalkboard.vect.init(Math.round(vect.x), Math.round(vect.y));
4800
6227
  }
4801
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6228
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4802
6229
  return Chalkboard.vect.init(Math.round(vect.x), Math.round(vect.y), Math.round(vect.z));
4803
6230
  }
4804
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
6231
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4805
6232
  return Chalkboard.vect.init(Math.round(vect.x), Math.round(vect.y), Math.round(vect.z), Math.round(vect.w));
4806
6233
  }
4807
6234
  else {
@@ -4815,13 +6242,13 @@ var Chalkboard;
4815
6242
  return Chalkboard.vect.dot(vect1, Chalkboard.vect.cross(vect2, vect3));
4816
6243
  };
4817
6244
  vect_3.scl = function (vect, num) {
4818
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
6245
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4819
6246
  return Chalkboard.vect.init(vect.x * num, vect.y * num);
4820
6247
  }
4821
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6248
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4822
6249
  return Chalkboard.vect.init(vect.x * num, vect.y * num, vect.z * num);
4823
6250
  }
4824
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
6251
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4825
6252
  return Chalkboard.vect.init(vect.x * num, vect.y * num, vect.z * num, vect.w * num);
4826
6253
  }
4827
6254
  else {
@@ -4829,13 +6256,13 @@ var Chalkboard;
4829
6256
  }
4830
6257
  };
4831
6258
  vect_3.slope = function (vect) {
4832
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
6259
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4833
6260
  return vect.y / vect.x;
4834
6261
  }
4835
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6262
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4836
6263
  return vect.z / Chalkboard.real.sqrt(vect.x * vect.x + vect.y * vect.y);
4837
6264
  }
4838
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
6265
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4839
6266
  return vect.w / Chalkboard.real.sqrt(vect.x * vect.x + vect.y * vect.y + vect.z * vect.z);
4840
6267
  }
4841
6268
  else {
@@ -4843,34 +6270,13 @@ var Chalkboard;
4843
6270
  }
4844
6271
  };
4845
6272
  vect_3.sub = function (vect1, vect2) {
4846
- if (typeof vect1.x === "number" &&
4847
- typeof vect1.y === "number" &&
4848
- typeof vect1.z === "undefined" &&
4849
- typeof vect1.w === "undefined" &&
4850
- typeof vect2.x === "number" &&
4851
- typeof vect2.y === "number" &&
4852
- typeof vect2.z === "undefined" &&
4853
- typeof vect2.w === "undefined") {
6273
+ if (Chalkboard.vect.isDimensionOf(vect1, 2) && Chalkboard.vect.isDimensionOf(vect2, 2)) {
4854
6274
  return Chalkboard.vect.init(vect1.x - vect2.x, vect1.y - vect2.y);
4855
6275
  }
4856
- else if (typeof vect1.x === "number" &&
4857
- typeof vect1.y === "number" &&
4858
- typeof vect1.z === "number" &&
4859
- typeof vect1.w === "undefined" &&
4860
- typeof vect2.x === "number" &&
4861
- typeof vect2.y === "number" &&
4862
- typeof vect2.z === "number" &&
4863
- typeof vect2.w === "undefined") {
6276
+ else if (Chalkboard.vect.isDimensionOf(vect1, 3) && Chalkboard.vect.isDimensionOf(vect2, 3)) {
4864
6277
  return Chalkboard.vect.init(vect1.x - vect2.x, vect1.y - vect2.y, vect1.z - vect2.z);
4865
6278
  }
4866
- else if (typeof vect1.x === "number" &&
4867
- typeof vect1.y === "number" &&
4868
- typeof vect1.z === "number" &&
4869
- typeof vect1.w === "number" &&
4870
- typeof vect2.x === "number" &&
4871
- typeof vect2.y === "number" &&
4872
- typeof vect2.z === "number" &&
4873
- typeof vect2.w === "number") {
6279
+ else if (Chalkboard.vect.isDimensionOf(vect1, 4) && Chalkboard.vect.isDimensionOf(vect2, 4)) {
4874
6280
  return Chalkboard.vect.init(vect1.x - vect2.x, vect1.y - vect2.y, vect1.z - vect2.z, vect1.w - vect2.w);
4875
6281
  }
4876
6282
  else {
@@ -4878,13 +6284,13 @@ var Chalkboard;
4878
6284
  }
4879
6285
  };
4880
6286
  vect_3.toArray = function (vect) {
4881
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
6287
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4882
6288
  return [vect.x, vect.y];
4883
6289
  }
4884
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6290
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4885
6291
  return [vect.x, vect.y, vect.z];
4886
6292
  }
4887
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
6293
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4888
6294
  return [vect.x, vect.y, vect.z, vect.w];
4889
6295
  }
4890
6296
  else {
@@ -4894,39 +6300,39 @@ var Chalkboard;
4894
6300
  vect_3.toComplex = function (vect) {
4895
6301
  return Chalkboard.comp.init(vect.x, vect.y);
4896
6302
  };
4897
- vect_3.toMatrix = function (vect, type) {
4898
- if (type === void 0) { type = "col"; }
4899
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
4900
- if (type === "col") {
6303
+ vect_3.toMatrix = function (vect, axis) {
6304
+ if (axis === void 0) { axis = 0; }
6305
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
6306
+ if (axis === 0) {
4901
6307
  return Chalkboard.matr.init([vect.x], [vect.y]);
4902
6308
  }
4903
- else if (type === "row") {
6309
+ else if (axis === 1) {
4904
6310
  return Chalkboard.matr.init([vect.x, vect.y]);
4905
6311
  }
4906
6312
  else {
4907
- throw new TypeError('Parameter "type" must be "col" or "row".');
6313
+ throw new TypeError('Parameter "axis" must be 0 or 1.');
4908
6314
  }
4909
6315
  }
4910
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
4911
- if (type === "col") {
6316
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
6317
+ if (axis === 0) {
4912
6318
  return Chalkboard.matr.init([vect.x], [vect.y], [vect.z]);
4913
6319
  }
4914
- else if (type === "row") {
6320
+ else if (axis === 1) {
4915
6321
  return Chalkboard.matr.init([vect.x, vect.y, vect.z]);
4916
6322
  }
4917
6323
  else {
4918
- throw new TypeError('Parameter "type" must be "col" or "row".');
6324
+ throw new TypeError('Parameter "axis" must be 0 or 1.');
4919
6325
  }
4920
6326
  }
4921
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
4922
- if (type === "col") {
6327
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
6328
+ if (axis === 0) {
4923
6329
  return Chalkboard.matr.init([vect.x], [vect.y], [vect.z], [vect.w]);
4924
6330
  }
4925
- else if (type === "row") {
6331
+ else if (axis === 1) {
4926
6332
  return Chalkboard.matr.init([vect.x, vect.y, vect.z, vect.w]);
4927
6333
  }
4928
6334
  else {
4929
- throw new TypeError('Parameter "type" must be "col" or "row".');
6335
+ throw new TypeError('Parameter "axis" must be 0 or 1.');
4930
6336
  }
4931
6337
  }
4932
6338
  else {
@@ -4934,13 +6340,13 @@ var Chalkboard;
4934
6340
  }
4935
6341
  };
4936
6342
  vect_3.toQuaternion = function (vect) {
4937
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
6343
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4938
6344
  return Chalkboard.quat.init(vect.x, vect.y, 0, 0);
4939
6345
  }
4940
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6346
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4941
6347
  return Chalkboard.quat.init(0, vect.x, vect.y, vect.z);
4942
6348
  }
4943
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
6349
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4944
6350
  return Chalkboard.quat.init(vect.x, vect.y, vect.z, vect.w);
4945
6351
  }
4946
6352
  else {
@@ -4948,13 +6354,13 @@ var Chalkboard;
4948
6354
  }
4949
6355
  };
4950
6356
  vect_3.toString = function (vect) {
4951
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
6357
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4952
6358
  return "(" + vect.x.toString() + ", " + vect.y.toString() + ")";
4953
6359
  }
4954
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6360
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4955
6361
  return "(" + vect.x.toString() + ", " + vect.y.toString() + ", " + vect.z.toString() + ")";
4956
6362
  }
4957
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
6363
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4958
6364
  return "(" + vect.x.toString() + ", " + vect.y.toString() + ", " + vect.z.toString() + ", " + vect.w.toString() + ")";
4959
6365
  }
4960
6366
  else {
@@ -4979,13 +6385,13 @@ var Chalkboard;
4979
6385
  return Chalkboard.vect.cross(vect1, Chalkboard.vect.cross(vect2, vect3));
4980
6386
  };
4981
6387
  vect_3.zero = function (vect) {
4982
- if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "undefined" && typeof vect.w === "undefined") {
6388
+ if (Chalkboard.vect.isDimensionOf(vect, 2)) {
4983
6389
  return Chalkboard.vect.init(vect.x * 0, vect.y * 0);
4984
6390
  }
4985
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "undefined") {
6391
+ else if (Chalkboard.vect.isDimensionOf(vect, 3)) {
4986
6392
  return Chalkboard.vect.init(vect.x * 0, vect.y * 0, vect.z * 0);
4987
6393
  }
4988
- else if (typeof vect.x === "number" && typeof vect.y === "number" && typeof vect.z === "number" && typeof vect.w === "number") {
6394
+ else if (Chalkboard.vect.isDimensionOf(vect, 4)) {
4989
6395
  return Chalkboard.vect.init(vect.x * 0, vect.y * 0, vect.z * 0, vect.w * 0);
4990
6396
  }
4991
6397
  else {