//行列數
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();
………………