-
Notifications
You must be signed in to change notification settings - Fork 0
/
av.matrix.min.js
12 lines (12 loc) · 5.97 KB
/
av.matrix.min.js
1
2
3
4
5
6
7
8
9
10
11
12
(function(){window.Matrix=window.Matrix||Object.create(Array);Object.defineProperty(Matrix,"version",{value:"1.0.6",enumerable:!0});Matrix=function(e){var b=Array.prototype.slice.call(arguments),a=Object.create(Matrix);a.constructor=Matrix.prototype.constructor;if(b.every(function(c){return"number"==typeof c}))0==b.length?a=[0]:(a=Array.apply(null,Array(b[0])).map(Number.prototype.valueOf,0),2==b.length&&1!=b[1]&&(a=a.map(function(c){return Array.apply(null,Array(b[1])).map(Number.prototype.valueOf,
0)})));else if(b.every(function(c){return c instanceof Array})){if(1==b.length&&0<b[0][0].length)a=b[0];else{if(b.some(function(c){return b[0].length!=c.length}))return console.error("Matrix:constructor: Every column must have same length"),[];a=Array.apply(null,Array(b.length)).map(Number.prototype.valueOf,0);a=a.map(function(c,a){return b[a]})}Matrix.isNaN(a)&&console.warn("Matrix:constructor: At least one element of the matrix is NaN")}else return console.error("Matrix:constructor: Ooops! Check your arguments"),
[];Object.defineProperty(a,"size",{get:function(){return[this.length,this[0].length||1]},enumerable:!0});Object.defineProperty(a,"trace",{get:function(){return this.isNaN()?(console.error("Matrix:trace: Matrix must be numerical"),NaN):this.reduce(function(c,a,d){return c+a[d]},0)},enumerable:!0});a.item=function(c,a){return this[c][a]||null};a.row=function(c){return this[c]||[]};a.column=function(c){return Array(this[0].length).map(function(a,d){return this[d][c]})};a.minor=function(c,h){if(this.size().some(function(c){return 2>
c}))return console.error("Matrix:submatrix: vectors don't have submatrices"),Matrix();var d=this.size,d=(new Matrix(d[0]-1,d[1]-1)).map(function(d,b){return d.map(function(d,f){b=b<c?b:b+1;f=f<h?f:f+1;return a[b][f]})});return Matrix(d)};a.fill=function(c){if(isNaN(c))return console.error("Matrix:fill: Arguments must be numerical"),Matrix();c=c||1;return Matrix(this.map(function(a){return a.map(function(){return c})}))};a.upper=function(){return Matrix(this.map(function(c,a){return c.map(function(c,
b){return a>=b?c:0})}))};a.lower=function(){return Matrix(this.map(function(c,a){return c.map(function(c,b){return a<=b?c:0})}))};a.transpose=function(){var c=this,a=this.size(),b=new Matrix(a[1],a[0]);return 1==a[0]&&1==a[1]?this:1==a[0]?Matrix(this[0]):1==a[1]?Matrix([this]):Matrix(b.map(function(a,b){return a.map(function(a,d){return c[d][b]})}))};a.scalar=function(c){if(a.isNaN())return console.error("Matrix:scalar: Matrix must be numerical"),Matrix();c=c||1;return this.map(function(a){return a.map(function(a){return a*
c})})};a.add=function(c){if(a.isNaN()||c.isNaN())return console.error("Matrix:add: Both Matrices must be numerical"),Matrix();var b=this.samesize(c)?this.map(function(a,b){return a.map(function(a,d){return a+c[b][d]})}):[];return b==[]?(console.error("Matrix:add: Dimenssions don't fit"),Matrix()):Matrix(b)};a.dot=function(c){if(a.isNaN()||c.isNaN())return console.error("Matrix:dot: Both Matrices must be numerical"),Matrix();if(a.size()[1]!=c.size()[0])return console.error("Matrix:dot: Dimenssions don't fit"),
Matrix();var b=this,d=(new Matrix(a.size()[0],c.size()[1])).map(function(a,d){return a.map(function(a,f){return b[d].reduce(function(a,b,d){return a+b*c[d][f]},0)})});return Matrix(d)};a.LU=function(){if(!this.square()||this.isNaN())return console.error("Matrix:det: Input must be an square numerical matrix"),Matrix();for(var a=this.size()[0],b=new Matrix.Diagonal(a),d=this.clone(),f=0;f<a-1;f++)for(var e=f+1;e<a;e++){b[e][f]=d[e][f]/d[f][f];for(var g=0;g<a;g++)d[e][g]-=d[f][g]*b[e][f]}return{L:Matrix(b),
U:Matrix(d)}};a.det=function(){if(!this.square()||this.isNaN())return console.error("Matrix:det: Input must be an square numerical matrix"),Matrix();var a=this.LU().U;return(new Matrix(a.size()[0])).reduce(function(b,d,e){return b*a[e][e]},1)};a.adjugate=function(){if(!this.square()||this.isNaN())return console.error("Matrix:cofactor: Input must be an square numerical matrix"),Matrix();var a=this,b=this.size()[0],b=new Matrix.Fill(b);return Matrix(b.map(function(b,e){return b.map(function(b,d){return Math.pow(-1,
e+d)*a.minor(e,d).det()})}))};a.inverse=function(){return!this.square()||this.isNaN()?(console.error("Matrix:inverse: Input must be an square numerical matrix"),Matrix()):0==this.det()?(console.error("Matrix:inverse: Input matrix is not invertible"),Matrix()):this.adjugate().transpose()/this.det()};a.samesize=function(a){var b=this.size();a=a.size();return b[0]==a[0]&&b[1]==a[1]};a.is=function(a){return this===a?!0:null!=this&&null!=a&&this.samesize(a)?this.reduce(function(b,d,e){return b&&d.reduce(function(b,
d,h){return b&&d==a[e][h]},!0)},!0):!1};a.isNaN=function(){return Matrix.isNaN(this)};a.symmetric=function(){return a.is(a.transpose())};a.square=function(){var a=this.size();return a[0]==a[1]};a.clone=function(){return new Matrix(JSON.parse(JSON.stringify(this)))};a.tostring=function(b){b=b||", ";return 1==a.size()[1]?this.join(b):a.reduce(function(a,d){return a+d.join(b)+"\n"},"")};return a};Matrix.Fill=function(e,b){if(isNaN(e)||isNaN(b))return console.error("Matrix:fill: Arguments must be numerical"),
Matrix();b=b||1;return Matrix(Matrix(e,e).map(function(a){return a.map(function(){return b})}))};Matrix.Diagonal=function(e,b){b=b||1;return isNaN(e)||isNaN(b)?(console.error("Matrix:diagonal: Arguments must be numerical"),Matrix()):new Matrix(Matrix(e,e).map(function(a,c){return a.map(function(a,d){return c==d?b:0})}))};Matrix.Upper=function(e,b){b=b||1;return isNaN(e)||isNaN(b)?(console.error("Matrix:upper: Arguments must be numerical"),Matrix()):new Matrix(Matrix(e,e).map(function(a,c){return a.map(function(a,
d){return c>=d?b:0})}))};Matrix.Lower=function(e,b){b=b||1;return isNaN(e)||isNaN(b)?(console.error("Matrix:lower: Arguments must be numerical"),Matrix()):new Matrix(Matrix(e,e).map(function(a,c){return a.map(function(a,d){return c<=d?b:0})}))};Matrix.isNaN=function(e){return"undefined"==typeof e[0].length?e.some(function(b){return isNaN(b)}):e.some(function(b){return b.some(function(a){return isNaN(a)})})}})();