#include<stdio.h>
#include<stdlib.h>
//define
struct Arr
{
int i,j;
int data;
};
struct ST
{
Arr* data;
int i,j,num;
};
//矩陣壓縮
ST* change(int arr[][3],int x,int y)
{
ST *M;
int i,j;
int count=0;
M=(ST*)malloc(sizeof(ST));
M->i=x;
M->j=y;
//遍歷矩陣 記錄矩陣元素個數
for(i=0;i<x;i++)
{
for(j=0;j<y;j++)
{
if(arr[i][j]!=0)
{
count++;
}//Of if
}//Of for j
}//Of for i
M->num=count;
M->data=(Arr*)malloc(sizeof(Arr)*count);
count=0;
//遍歷矩陣 找到元素在矩陣中的座標
for(i=0;i<x;i++)
{
for(j=0;j<y;j++)
{
if(arr[i][j]!=0)
{
M->data[count].i=i+1;
M->data[count].j=j+1;
M->data[count].data=arr[i][j];
count++;
}//Of if
}//of for j
}//Of for i
return M;
}//Of change
//打印矩陣
void print(ST* m)
{
int i;
for(i=0;i<m->num;i++)
{
printf("%d\t%d\t%d\n",m->data[i].i,m->data[i].j,m->data[i].data);
}//Of for i
}//Of print
//轉置矩陣 算法1
ST* transpose(ST* M)
{
ST* T;
int iI,jJ;
int count=0;
T=(ST*)malloc(sizeof(ST));
T->data=(Arr*)malloc(sizeof(Arr)*M->num);
T->i=M->j;
T->j=M->i;
T->num=M->num;
for(iI=0;iI<M->j;iI++)
{
for(jJ=0;jJ<M->num;jJ++)
{
if(M->data[jJ].j==iI+1)
{
T->data[count].i=M->data[jJ].j;
T->data[count].j=M->data[jJ].i;
T->data[count].data=M->data[jJ].data;
count++;
}//Of if
}//Of for j
}//Of for i
return T;
}//Of trnaspose
//轉置矩陣 算法2
ST* quickTranspose(ST* M)
{
ST *T;
int count[3]={0};//記錄對應行列的個數
int position[3]={0};//記錄對應元素應該插入的位置
int i,num=0;
T=(ST*)malloc(sizeof(ST));
T->data=(Arr*)malloc(sizeof(Arr)*M->num);
T->i=M->j;
T->j=M->i;
T->num=M->num;
for(i=0;i<M->num;i++)
{
count[M->data[i].j-1]++;
}//Of for i
for(i=1;i<3;i++)
{
position[i]=count[i-1]+position[i-1];
}//Of for i
for(i=0;i<M->num;i++)
{
T->data[position[M->data[i].j-1]].i=M->data[i].j;
T->data[position[M->data[i].j-1]].j=M->data[i].i;
T->data[position[M->data[i].j-1]].data=M->data[i].data;
position[M->data[i].j-1]++;
}//Of for i
return T;
}
//main
int main()
{
ST *M,*T;
int array[4][3]={{0,12,9},{0,0,0},{-3,0,0},{5,0,0}};
printf("壓縮後矩陣爲:\n");
M=change(array,4,3);
print(M);
printf("轉置後矩陣爲:\n");
T=transpose(M);
print(T);
printf("快速算法轉置後矩陣爲:\n");
T=quickTranspose(M);
print(T);
return 0;
}//Of main
對稀疏矩陣壓縮後轉置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.