| dojo.provide("dojo.math.matrix"); |
| dojo.math.matrix.iDF=0; |
| dojo.math.matrix.ALMOST_ZERO=1e-10; |
| dojo.math.matrix.multiply=function(a,b){ |
| var ay=a.length; |
| var ax=a[0].length; |
| var by=b.length; |
| var bx=b[0].length; |
| if(ax!=by){ |
| dojo.debug("Can't multiply matricies of sizes "+ax+","+ay+" and "+bx+","+by); |
| return [[0]]; |
| } |
| var c=[]; |
| for(var k=0;k<ay;k++){ |
| c[k]=[]; |
| for(var i=0;i<bx;i++){ |
| c[k][i]=0; |
| for(var m=0;m<ax;m++){ |
| c[k][i]+=a[k][m]*b[m][i]; |
| } |
| } |
| } |
| return c; |
| }; |
| dojo.math.matrix.product=function(){ |
| if(arguments.length==0){ |
| dojo.debug("can't multiply 0 matrices!"); |
| return 1; |
| } |
| var _b=arguments[0]; |
| for(var i=1;i<arguments.length;i++){ |
| _b=dojo.math.matrix.multiply(_b,arguments[i]); |
| } |
| return _b; |
| }; |
| dojo.math.matrix.sum=function(){ |
| if(arguments.length==0){ |
| dojo.debug("can't sum 0 matrices!"); |
| return 0; |
| } |
| var _d=dojo.math.matrix.copy(arguments[0]); |
| var _e=_d.length; |
| if(_e==0){ |
| dojo.debug("can't deal with matrices of 0 rows!"); |
| return 0; |
| } |
| var _f=_d[0].length; |
| if(_f==0){ |
| dojo.debug("can't deal with matrices of 0 cols!"); |
| return 0; |
| } |
| for(var i=1;i<arguments.length;++i){ |
| var arg=arguments[i]; |
| if(arg.length!=_e||arg[0].length!=_f){ |
| dojo.debug("can't add matrices of different dimensions: first dimensions were "+_e+"x"+_f+", current dimensions are "+arg.length+"x"+arg[0].length); |
| return 0; |
| } |
| for(var r=0;r<_e;r++){ |
| for(var c=0;c<_f;c++){ |
| _d[r][c]+=arg[r][c]; |
| } |
| } |
| } |
| return _d; |
| }; |
| dojo.math.matrix.inverse=function(a){ |
| if(a.length==1&&a[0].length==1){ |
| return [[1/a[0][0]]]; |
| } |
| var tms=a.length; |
| var m=dojo.math.matrix.create(tms,tms); |
| var mm=dojo.math.matrix.adjoint(a); |
| var det=dojo.math.matrix.determinant(a); |
| var dd=0; |
| if(det==0){ |
| dojo.debug("Determinant Equals 0, Not Invertible."); |
| return [[0]]; |
| }else{ |
| dd=1/det; |
| } |
| for(var i=0;i<tms;i++){ |
| for(var j=0;j<tms;j++){ |
| m[i][j]=dd*mm[i][j]; |
| } |
| } |
| return m; |
| }; |
| dojo.math.matrix.determinant=function(a){ |
| if(a.length!=a[0].length){ |
| dojo.debug("Can't calculate the determiant of a non-squre matrix!"); |
| return 0; |
| } |
| var tms=a.length; |
| var det=1; |
| var b=dojo.math.matrix.upperTriangle(a); |
| for(var i=0;i<tms;i++){ |
| var bii=b[i][i]; |
| if(Math.abs(bii)<dojo.math.matrix.ALMOST_ZERO){ |
| return 0; |
| } |
| det*=bii; |
| } |
| det=det*dojo.math.matrix.iDF; |
| return det; |
| }; |
| dojo.math.matrix.upperTriangle=function(m){ |
| m=dojo.math.matrix.copy(m); |
| var f1=0; |
| var _24=0; |
| var tms=m.length; |
| var v=1; |
| dojo.math.matrix.iDF=1; |
| for(var col=0;col<tms-1;col++){ |
| if(typeof m[col][col]!="number"){ |
| dojo.debug("non-numeric entry found in a numeric matrix: m["+col+"]["+col+"]="+m[col][col]); |
| } |
| v=1; |
| var _28=0; |
| while((m[col][col]==0)&&!_28){ |
| if(col+v>=tms){ |
| dojo.math.matrix.iDF=0; |
| _28=1; |
| }else{ |
| for(var r=0;r<tms;r++){ |
| _24=m[col][r]; |
| m[col][r]=m[col+v][r]; |
| m[col+v][r]=_24; |
| } |
| v++; |
| dojo.math.matrix.iDF*=-1; |
| } |
| } |
| for(var row=col+1;row<tms;row++){ |
| if(typeof m[row][col]!="number"){ |
| dojo.debug("non-numeric entry found in a numeric matrix: m["+row+"]["+col+"]="+m[row][col]); |
| } |
| if(typeof m[col][row]!="number"){ |
| dojo.debug("non-numeric entry found in a numeric matrix: m["+col+"]["+row+"]="+m[col][row]); |
| } |
| if(m[col][col]!=0){ |
| var f1=(-1)*m[row][col]/m[col][col]; |
| for(var i=col;i<tms;i++){ |
| m[row][i]=f1*m[col][i]+m[row][i]; |
| } |
| } |
| } |
| } |
| return m; |
| }; |
| dojo.math.matrix.create=function(a,b,_2e){ |
| if(!_2e){ |
| _2e=0; |
| } |
| var m=[]; |
| for(var i=0;i<b;i++){ |
| m[i]=[]; |
| for(var j=0;j<a;j++){ |
| m[i][j]=_2e; |
| } |
| } |
| return m; |
| }; |
| dojo.math.matrix.ones=function(a,b){ |
| return dojo.math.matrix.create(a,b,1); |
| }; |
| dojo.math.matrix.zeros=function(a,b){ |
| return dojo.math.matrix.create(a,b,0); |
| }; |
| dojo.math.matrix.identity=function(_36,_37){ |
| if(!_37){ |
| _37=1; |
| } |
| var m=[]; |
| for(var i=0;i<_36;i++){ |
| m[i]=[]; |
| for(var j=0;j<_36;j++){ |
| m[i][j]=(i==j?_37:0); |
| } |
| } |
| return m; |
| }; |
| dojo.math.matrix.adjoint=function(a){ |
| var tms=a.length; |
| if(tms<=1){ |
| dojo.debug("Can't find the adjoint of a matrix with a dimension less than 2"); |
| return [[0]]; |
| } |
| if(a.length!=a[0].length){ |
| dojo.debug("Can't find the adjoint of a non-square matrix"); |
| return [[0]]; |
| } |
| var m=dojo.math.matrix.create(tms,tms); |
| var ii=0; |
| var jj=0; |
| var ia=0; |
| var ja=0; |
| var det=0; |
| var ap=dojo.math.matrix.create(tms-1,tms-1); |
| for(var i=0;i<tms;i++){ |
| for(var j=0;j<tms;j++){ |
| ia=0; |
| for(ii=0;ii<tms;ii++){ |
| if(ii==i){ |
| continue; |
| } |
| ja=0; |
| for(jj=0;jj<tms;jj++){ |
| if(jj==j){ |
| continue; |
| } |
| ap[ia][ja]=a[ii][jj]; |
| ja++; |
| } |
| ia++; |
| } |
| det=dojo.math.matrix.determinant(ap); |
| m[i][j]=Math.pow(-1,(i+j))*det; |
| } |
| } |
| m=dojo.math.matrix.transpose(m); |
| return m; |
| }; |
| dojo.math.matrix.transpose=function(a){ |
| var m=dojo.math.matrix.create(a.length,a[0].length); |
| for(var i=0;i<a.length;i++){ |
| for(var j=0;j<a[i].length;j++){ |
| m[j][i]=a[i][j]; |
| } |
| } |
| return m; |
| }; |
| dojo.math.matrix.format=function(a,_4b){ |
| if(arguments.length<=1){ |
| _4b=5; |
| } |
| function format_int(x,dp){ |
| var fac=Math.pow(10,dp); |
| var a=Math.round(x*fac)/fac; |
| var b=a.toString(); |
| if(b.charAt(0)!="-"){ |
| b=" "+b; |
| } |
| var _51=0; |
| for(var i=1;i<b.length;i++){ |
| if(b.charAt(i)=="."){ |
| _51=1; |
| } |
| } |
| if(!_51){ |
| b+="."; |
| } |
| while(b.length<dp+3){ |
| b+="0"; |
| } |
| return b; |
| } |
| var ya=a.length; |
| var xa=ya>0?a[0].length:0; |
| var _55=""; |
| for(var y=0;y<ya;y++){ |
| _55+="| "; |
| for(var x=0;x<xa;x++){ |
| _55+=format_int(a[y][x],_4b)+" "; |
| } |
| _55+="|\n"; |
| } |
| return _55; |
| }; |
| dojo.math.matrix.copy=function(a){ |
| var ya=a.length; |
| var xa=a[0].length; |
| var m=dojo.math.matrix.create(xa,ya); |
| for(var y=0;y<ya;y++){ |
| for(var x=0;x<xa;x++){ |
| m[y][x]=a[y][x]; |
| } |
| } |
| return m; |
| }; |
| dojo.math.matrix.scale=function(k,a){ |
| a=dojo.math.matrix.copy(a); |
| var ya=a.length; |
| var xa=a[0].length; |
| for(var y=0;y<ya;y++){ |
| for(var x=0;x<xa;x++){ |
| a[y][x]*=k; |
| } |
| } |
| return a; |
| }; |