安卓手机扫描二维码安装App

一个递归计算行列式的js类


/**作者:烂柯野人

测试方式:安装node

拷贝代码到记事本中,另存为.js文件,再在同一目录新建一个test.js,写入以下两句


var det = require("./utils/det.js"); //专用于测试代码的js,不再用scheduleJob


det.testDet();


在命令行中用cd跳转到以上两文件所在目录,运行 node test.js

**/

//计算n阶行列式

//传入一个一维数组

//如[1,2,3,4]为二阶行列式

//如[1,2,3,4,5,6,7,8,9]为三阶行列式

class Det {


constructor(detData) {

this.det = detData;

this.l=detData.length;

this.n=Math.sqrt(this.l)

this.isDet =false;

this.result=0;

if(Number.isInteger(this.n)){

this.isDet=true;

this.doDet();

}

}

//解行列式

//计算方法,按第一列展开成各项与其代数余子式之和

doDet=function(){

if(this.n==1){

this.isDet=false;

}

if(this.n==2){

this.result= this.det_2(this.det[0],this.det[1],this.det[2],this.det[3]);

}

if(this.n==3){

this.result= this.det_3(this.det)

}

if(this.n>=4){

this.result=this.det_n(this.det,this.n);

}

}


//二阶

det_2=function(a1,a2,a3,a4){

return a1*a4-a2*a3;

}


//三阶用对角线法则

det_3=function(a){

return a[0]*a[4]*a[8]+a[3]*a[7]*a[2]+a[6]*a[5]*a[1]-a[2]*a[4]*a[6]-a[1]*a[3]*a[8]-a[0]*a[7]*a[5];

}


//n阶,(三阶以上行列式无对角线法则)

det_n=function(det,n){

//n阶行列式按第一列展开成n个n-1阶代数余子式之和

let d=0;

for (let i=0;i<n;i++){

let s=[] //余子式

for(let j=0;j<n*n;j++){

if(j>=i*n && j<(i+1)*n ){

}else{

if(j%n!=0){

s.push(det[j])

}

}

}

let d1=0;

if((n-1)==3){

d1=det[n*i]*Math.pow(-1,i)*this.det_3(s);//代数余子式

}else{

d1=det[n*i]*Math.pow(-1,i)*this.det_n(s,n-1);

}

d=d+d1;

}

return d;

}


getResult=function(){

if(this.isDet){

return this.result;

}else{

return '按行从左到右从上到下连续输入,数字间以英文逗号分隔';

}

}

}



exports.testDet = function(){

console.log('test---------');


//四阶测试,

//var d=[3,2,1,1,0,4,-2,-3,2,3,-2,4,1,5,0,6]; //-297

var d=[0,1,1,1,1,0,1,1,1,1,0,1,1,1,1,0];

/*五阶测试,

var d=[1,2,1,0,3,

0,1,3,5,2,

2,3,1,6,2,

1,4,0,2,1,

5,0,4,1,6] //-381*/

/*六阶测试,

var d=[1,2,1,0,3,4,

0,1,3,5,2,6,

2,3,1,6,2,1,

1,4,0,2,1,4,

5,0,4,1,6,2,

3,5,2,3,1,2] //2162*/

// 七阶测试,

/*var d=[1,2,1,0,3,4,2,

0,1,3,5,2,6,4,

2,3,1,6,2,1,0,

1,4,0,2,1,4,5,

5,0,4,1,6,2,3,

3,5,2,3,1,2,6,

1,2,3,4,5,6,1] */ //1906


console.log('七阶测试=',d)

let testDet=new Det(d)

console.log('result=',testDet.getResult())

}


苹果手机扫描二维码安装App