//行列数
var m=5,n=6;
//子矩阵行列数
var r=3,d=3;
//矩阵内数值最大值
var maxNumber=16;
/**
* 流式序列,从0~m这m+1个数中不重复取出有序的n个数
* @param m
* @param n
* @returns {*}
*/
function subArrayIndex(m,n){
if(n>m||m<=0) return null;
var startX=0,pStack=[];
return {
next:function(){
if(n==1){
return startX<=m?(cstartX++):null;
}
while(true){
while((n-pStack.length)!=1){
pStack[pStack.length]=startX++;
continue;
}
if(pStack[0]>(m-n+1)){
return null;
}
if(startX<=m){
var arr=[];
for(var i=0;pStack[i]!=undefined;++i){
arr[i]=pStack[i];
}
arr[arr.length]=startX++;
return arr;
}
while(pStack.length>0){
var preX=pStack.pop();
preX++;
if(preX<m){
pStack[pStack.length]=preX;
startX=preX+1;
break;;
}
}
}
},
};
}
function outputMatrix(m){
var output="",fixChar=' ',len=(maxNumber+"").length;
var fixLength=function(d){
var f=d+"";
for(var k=len-(d+"").length;k>0;--k){
f=fixChar+f;
}
return f;
}
m.map(function(a){
a.map(function(b){
output+=" "+fixLength(b);
});
output+="\n";
});
return output;
}
var matrix=[],colSeq=[],rowSeq=[],current={};
var index=0;
function refresh(){
//$(".matrix").remove();
var x=document.getElementsByClassName("matrix");
var aaa=[];
for(var k=0;k<x.length;++k){
aaa[k]=x[k];
}
aaa.map(function(f){f.remove()})
var str= "大矩阵为"+m+"行"+n+"列,子矩阵为"+r+"行"+d+"列\n";
//生成一个随机矩阵
for(var i=0;i<m;++i){
matrix[i]=[];
for(var j=0;j<n;++j){
matrix[i][j]=Math.floor(Math.random()*16);
}
}
outputHtml(str+outputMatrix(matrix))
colSeq=subArrayIndex(m-1,r);
current=colSeq.next();
rowSeq=subArrayIndex(n-1,d);
index=0;
drawNext();
}
function drawNext(){
var cx=current;
var rx=rowSeq.next();
if(rx==null){
current=colSeq.next();
rowSeq=subArrayIndex(n-1,d);
}
if(cx==null) return ;
if(cx&&rx){
var arr=[];
for(var i=0;i<cx.length;++i){
arr[i]=[];
for(var j=0;j<rx.length;++j){
arr[i][j]=matrix[cx[i]][cx[j]];
}
}
outputHtml("第"+index+"个\n行号"+cx+" 列号"+rx+"\n"+outputMatrix(arr));
index++;
}
}
//输出结果
function outputHtml(str){
console.log(str+"\n");
}
//计算和输出随机大矩阵与第0个子矩阵
refresh();
//计算和输出第1个子矩阵
drawNext();
//计算和输出第2个子矩阵
drawNext();
//计算和输出第3个子矩阵
drawNext();
//计算和输出第4个子矩阵
drawNext();
//计算和输出第5个子矩阵
drawNext();
………………