まばらな行列の3元のグループの表現と回転

18430 ワード

まばらな行列の3元のグループの表現と回転
  • 三元は
  • を表しています.
  • 回転
  • -順番保持
  • -順番に取って直接に
  • を保存します.
    三元グループは
    データ構造
  • 三元グループタイプ
  • typedef struct
    {
         
    	int r;//  
    	int c;//  
    	int d;//   
    }TupNode;//     
    
  • 三元組順表のタイプ
  • typedef struct
    {
         
    	int rows;//  
    	int cols;//  
    	int nums;//      
    	TupNode data[Maxsize];
    }TSMatrix;//         
    
  • 三元群は、疎行列の作成
  • である.
    #include
    #define Maxsize 100
    #define N 5
    #define M 5
    void Create(TSMatrix &t,int A[N][M])//     
    {
         
    	t.rows=N;//   
    	t.cols=M;
    	t.nums=0;//        
    	for(int i=0;i<N;i++)//          
    	{
         
    		for(int j=0;j<M;j++)
    			if(A[i][j]!=0)// 0          
    			{
         
    				num[j+1]++;     //  num      
    				t.data[t.nums].r=i;//        
    				t.data[t.nums].c=j;
    				t.data[t.nums].d=A[i][j];
    				t.nums++;
    			}
    	}
    }
    
  • 三元グループの出力
  • void Disp(TSMatrix t)//     
    {
         
    	if(t.nums<=0)
    		return;
    	for(int i=0;i<t.nums;i++)
    		printf("\t%d\t%d\t%d
    "
    ,t.data[i].r+1,t.data[i].c+1,t.data[i].d); }
    入れ替える?入れ換える
    -順次保存
    直接三元グループの中にマトリックスの中に一列もないことを見つけて、三元グループの中に入れ直します.
    void TranMat(TSMatrix ta,TSMatrix &tb)//   
    {
         
    	int q=0;
    	tb.rows=ta.rows;
    	tb.cols=ta.cols;
    	tb.nums=ta.nums;
    	if(ta.nums!=0)
    	{
         
    		for(int i=0;i<ta.cols;i++)//    
    			for(int j=0;j<ta.nums;j++)//        
    				if(ta.data[j].c==i)
    				{
         
    					tb.data[q].r=ta.data[j].c;
    					tb.data[q].c=ta.data[j].r;
    					tb.data[q].d=ta.data[j].d;
    					q++;
    				}
    	}
    }
    
    -直接保存する順番を取ります.
    転置の法則は補助データ構造として2つの配列を導入することが分かった.num[nu]:行列Aのある列の非ゼロ要素の個数を表す.cpot[nu]:初期値はマトリクスAのある列の最初の非ゼロ要素がBにある位置を表します.numとcpotのデリバリー関係:
  • cpot[0]=0;
  • cpot[col]=cpot[col-1]+num[col-1]1≦col<nu
  • は、転置後のマトリクスBの行数、列数、および非ゼロ要素の個数を設定する.
  • は、Aの各列の非ゼロ要素の個数を計算する.
  • は、Aの各列の最初の非ゼロ要素のBにおける下付きを計算する.
  • は、Aの各非ゼロ要素に対応する3つのタプルを順次取得する.2.1この元素のBにおける下付きpbを決定する.2.2この要素の行番号列番号を交換してBのpbの位置に預け入れる.2.3当該元素のある列の次の要素の保管場所を事前に置く.
  • int cp()// cpot  
    {
         
    	cpot[0]=0;
    	int i;
    	for(i=1;i<Maxsize;i++)
    	{
         
    		cpot[i]=cpot[i-1]+num[i];
    	}
    	return i;
    		
    }
    void TranMat2(TSMatrix ta,TSMatrix &tb)//      
    {
         
    	tb.rows=ta.rows;
    	tb.cols=ta.cols;
    	tb.nums=ta.nums;
    	int a=cp();
    	for(int i=0;i<ta.nums;i++)
    	{
         
    		int pb=ta.data[i].c;
    		tb.data[cpot[pb]].r=ta.data[i].c;
    		tb.data[cpot[pb]].c=ta.data[i].r;
    		tb.data[cpot[pb]].d=ta.data[i].d;
    		cpot[pb]++;//     
    		// ,2.3                   ;
    	}
    	
    }
    **                **