关于稀疏矩阵三元组的转置

关于稀疏矩阵三元组的转置,第1张

内容

假设两个稀疏矩阵A和B,他们均为m行n列,要求表写求矩阵的加法即:C=A+B的算法(C矩阵存储A与B相加的结果)

分析

利用一维数组来存储,一维数组顺序存放非零元素的行号、列号和数值,行号-1表示结束,然后进行矩阵加法运算时依次扫描矩阵A和B的行列值,并以行优先。当行列相同的时候,将第三个元素的值相加和以及行列号三个元素存入结果数组C中;不相同时,将A或B的三个元素直接存入结果数组中。

代码

// fanchencpp : 定义控制台应用程序的入口点。 // #include "stdafxh" #include<iostream> using namespace std; #define LINE 10 struct Node{ //行号 int row; //列号 int line; //数据 int data; }; //初始化数组 int init(Node array[]) { int row,line,data; int index = 0; while(cin>>row){ if(row == -1){ break; } cin>>line>>data; array[index]data=data; array[index]line = line; array[index]row = row; index++; } return index; } //打印数组 void printArray(Node array[],int len) { for(int i = 0;i < len;i++){ cout<<array[i]row<<" "<<array[i]line<<" "<<array[i]data<<endl; } } int calc(Node a

矩阵加减注意格式

#include <stdioh>

#define maxsize 20

typedef int data;

typedef struct

{

int i,j;

data v;

}mat;

typedef struct

{

int m,n,t;

mat dtt[maxsize+1];

}matrix;

matrix a,b,c;

void transmat(matrix a,matrix b)

{

int p,q,col;

b->m=an;

b->n=am;

b->t=at;

if(at!=0)

{

q=1;

for(col=1;col<=an;col++)

for(p=1;p<=at;p++)

if(adtt[p]j==col)

{

b->dtt[q]j=adtt[p]i;

b->dtt[q]i=adtt[p]j;

b->dtt[q]v=adtt[p]v;

q++;

}

}

}

void creat(matrix x)

{

printf("\nn,m,t=");

scanf("%d,%d,%d",&x->n,&x->m,&x->t);

for(int i=1;i<=x->t;i++)

{

printf("\ni,j,v=");

scanf("%d,%d,%d",&x->dtt[i]i,&x->dtt[i]j,&x->dtt[i]v);

}

}

void mout(matrix x)

{

printf("\nn,m,t=");

printf("%d,%d,%d\n",xn,xm,xt);

for(int i=1;i<=xt;i++)

{

printf("\ni,j,v=");

printf("%d,%d,%d\n",xdtt[i]i,xdtt[i]j,xdtt[i]v);

}

}

void jiajian(matrix x,matrix y,matrix b)

{

int t;

printf("\n1加");

printf("\n2减\n\n");

scanf("%d",&t);

if(t==1)

{

int s=0,j=1,z=1;

b->m=xm;

b->n=xn;

for(int i=1;i<=b->n;i++)

{

for(;j<=xt,z<=yt;)

{

if(xdtt[j]i!=i&&ydtt[z]i!=i)

{

break;

}

else if(xdtt[j]i!=i)

{

s++;

b->dtt[s]i=i;

b->dtt[s]j=ydtt[z]j;

b->dtt[s]v=ydtt[z]v;

z++;

}

else if(ydtt[z]i!=i)

{

s++;

b->dtt[s]i=i;

b->dtt[s]j=xdtt[j]j;

b->dtt[s]v=xdtt[j]v;

j++;

}

else if(xdtt[j]j>ydtt[z]j)

{

s++;

b->dtt[s]i=i;

b->dtt[s]j=ydtt[z]j;

b->dtt[s]v=ydtt[z]v;

z++;

}

else if(xdtt[j]j==ydtt[z]j)

{

s++;

b->dtt[s]i=i;

b->dtt[s]j=ydtt[z]j;

b->dtt[s]v=ydtt[z]v+xdtt[j]v;

z++;

j++;

}

else if(xdtt[j]j<ydtt[z]j)

{

s++;

b->dtt[s]i=i;

b->dtt[s]j=xdtt[j]j;

b->dtt[s]v=xdtt[j]v;

j++;

}

}

}

b->t=s;

}

else if(t==2)

{

int s=0,j=1,z=1;

b->m=xm;

b->n=xn;

for(int i=1;i<=b->n;i++)

{

for(;j<=xt,z<=yt;)

{

if(xdtt[j]i!=i&&ydtt[z]i!=i)

{

break;

}

else if(xdtt[j]i!=i)

{

s++;

b->dtt[s]i=i;

b->dtt[s]j=ydtt[z]j;

b->dtt[s]v=-ydtt[z]v;

z++;

}

else if(ydtt[z]i!=i)

{

s++;

b->dtt[s]i=i;

b->dtt[s]j=xdtt[j]j;

b->dtt[s]v=xdtt[j]v;

j++;

}

else if(xdtt[j]j>ydtt[z]j)

{

s++;

b->dtt[s]i=i;

b->dtt[s]j=ydtt[z]j;

b->dtt[s]v=-ydtt[z]v;

z++;

}

else if(xdtt[j]j==ydtt[z]j)

{

if(xdtt[j]v-ydtt[z]v!=0)

{

s++;

b->dtt[s]i=i;

b->dtt[s]j=ydtt[z]j;

b->dtt[s]v=xdtt[j]v-ydtt[z]v;

}

z++;

j++;

}

else if(xdtt[j]j<ydtt[z]j)

{

s++;

b->dtt[s]i=i;

b->dtt[s]j=xdtt[j]j;

b->dtt[s]v=xdtt[j]v;

j++;

}

}

}

b->t=s;

}

}

int main(int argc, char argv[])

{

printf("1创建\n");

printf("2转置\n");

printf("3矩阵加减\n");

printf("4退出\n");

printf("\n\n\n");

int t;

while(~scanf("%d",&t))

{

if(t==1)

{

creat(&a);

}

else if(t==2)

{

transmat(a,&b);

mout(b);

}

else if(t==3)

{

creat(&c);

jiajian(a,c,&b);

mout(b);

}

else if(t==4)

break;

printf("\n\n\n");

printf("1创建\n");

printf("2转置\n");

printf("3矩阵加减\n");

printf("4退出\n");

printf("\n\n\n");

}

return 0;

}

#include<iostream>

using std::cout;

using std::cin;

using std::endl;

struct node

{

int r;//行标

int c;//列标

double dat;//数据

};

class triple

{

private:

int row;//行数

int col;//列数

int num;//非零个数

node ptr;//存放数组的首地址

public:

triple(int co,int ro,int nu):col(co),row(ro),num(nu)

{

ptr=new node[num];//分配num,盛放num个元素

cout<<"请输入"<<num<<"个三元组元素\n"<<"格式为: 2 3 67\n其中2为行标,3为列标,67为数据元素"<<endl;

for(int i=0;i<num;i++)

{

cin>>ptr[i]r;

cin>>ptr[i]c;

cin>>ptr[i]dat;

}

}

~triple(){delete[]ptr;}

void print()

{

int flag=ptr[0]r;

cout<<"第"<<flag<<"行元素为:";

for(int i=0;i<num;i++)

{

if(ptr[i]r!=flag)

{

cout<<"\n";

flag=ptr[i]r;

cout<<endl;

cout<<"第"<<flag<<"行元素为:";

}

cout<<"("<<ptr[i]r<<","<<ptr[i]c<<","<<ptr[i]dat<<")  ";

}

}

void transpose()

{

int flag=0;

for(int i=1;i<=col;i++)

{

for(int j=0;j<num;j++)

{

if(ptr[j]c==i)

{

if(flag!=ptr[j]c)

{

flag=ptr[j]c;

cout<<"\n第"<<ptr[j]c<<"行为:";

}

cout<<"("<<ptr[j]c<<","<<ptr[j]r<<","<<ptr[j]dat<<")  ";

}

}

}

}

};

void main()

{

cout<<"请输入数组的行列和元素个数:\n";

int a[3];

for(int i=0;i<3;i++)

{

cin>>a[i];

}

triple t(a[0],a[1],a[2]);

tprint();//输出原矩阵

cout<<"转制后的矩阵为:";

ttranspose();

}

//普通转置算法

//时间复杂度:O(tm);t是非零元个数,m是列数。每转置一列需要扫描全部三元数组

#include "stdafxh"

#include <iostream>

struct element{

int value;

int i,j;

};

struct matrix{

int c,v,t;

struct element data;

};

int main(int argc, char argv[])

{

int m,n,t;

int i,j,d;

int index;

matrix mt,lm;//lm是转置后的矩阵

element e;

//原是矩阵的输入

printf("输入矩阵的行数,列数,非零元个数n");

scanf("%d%d%d",&m,&n,&t);

mt=new matrix;

mt->c=m;

mt->v=n;

mt->t=t;

mt->data=new element[t];

printf("按行序输入矩阵的非零元,按三元组形式:行 列 数据n");

index=0;

do{

scanf("%d%d%d",&i,&j,&d);

e=new element;

e->i=i;e->j=j;e->value=d;

mt->data[index]=e;

index++;

}while(index<t);

//对矩阵转置

lm=new matrix;

lm->data=new element[t];

i=0;j=0;index=0;

int k=0;

lm->c=n;//行数和列数对掉,非零元总数不变

lm->v=m;

lm->t=t;

for(i=0;i<n;i++){//对所有三元组扫描

for(j=0;j<t;j++){//对原始矩阵的每一列扫描

if(mt->data[j]j==i){//对每一列进行转置

//对此列上的元素对掉信息

lm->data[k]i=mt->data[j]j;

lm->data[k]j=mt->data[j]i;

lm->data[k]value=mt->data[j]value;

k++;

}

else continue;

}

}

index=0;

printf("转置后的矩阵n");

printf("行 列 值n");

while(index<t){

printf("(%d %d %d)n",lm->data[index]i,lm->data[index]j,lm->data[index]value);

index++;

}

return 0;

}

快速转置代码如下:

//快速转置算法

#include "stdafxh"

#include <iostream>

struct element{

int value;

int i,j;

};

struct matrix{

int c,v,t;

struct element data;

};

//每行第一个非零元位置数组position,每行非零元个数数组number

int position;

int number;

int main(int argc, char argv[])

{

int m,n,t;

int i,j,d;

int index;

matrix mt,lm;//lm是转置后的矩阵

element e;

//原是矩阵的输入

printf("输入矩阵的行数,列数,非零元个数n");

scanf("%d%d%d",&m,&n,&t);

mt=new matrix;

mt->c=m;

mt->v=n;

mt->t=t;

mt->data=new element[t];

position=new int[m];

number=new int[m];

printf("按行序输入矩阵的非零元,按三元组形式:行 列 数据n");

index=0;

do{

scanf("%d%d%d",&i,&j,&d);

e=new element;

e->i=i;e->j=j;e->value=d;

mt->data[index]=e;

index++;

}while(index<t);

//建立转置矩阵位置数组

matrix bm=new matrix;

bm->c=n;

bm->v=m;

bm->t=t;

bm->data=new element[t];

for(i=0;i<n;i++)number[i]=0;

for(i=0;i<t;i++)number[mt->data[i]j]++;

position[0]=0;

for(i=1;i<n;i++){

position[i]=position[i-1]+number[i-1];

}

for(i=0;i<t;i++){

index=mt->data[i]j;j=position[index];//原始数组第j列的第一个元素,当这一列再次有元素时,依次插入

bm->data[j]i=mt->data[i]j;

bm->data[j]j=mt->data[i]i;

bm->data[j]value=mt->data[i]value;

position[index]++;//此列下一个元素为上一个元素加1

}

//对矩阵快速转置

index=0;

printf("n原三元组矩阵n");

while(index<t){

printf("(%d %d %d)n",mt->data[index]i,mt->data[index]j,mt->data[index]value);

index++;

}

index=0;

printf("n转置后的三元组矩阵n");

while(index<t){

printf("(%d %d %d)n",bm->data[index]i,bm->data[index]j,bm->data[index]value);

index++;

}

return 0;

}

#include<iostream>

using

namespace

std;

class

matrix

{

public:

int

data[100][100];

int

m,n;

};

typedef

int

spmatrix[100][3];

void

Init(matrix&

mx);//稀疏矩阵初始化

void

SpmDisplay(spmatrix

spm);//显示三元组表示的矩阵

void

Compressmatrix(matrix

A,spmatrix

B);//将稀疏矩阵转换为三元组矩阵

void

Transpmatrix(spmatrix

B,spmatrix&

C);//将三元组矩阵转置

int

main()

{

matrix

mx;

spmatrix

spm1,spm2;

//矩阵初始化

Init(mx);

//矩阵转为三元组

Compressmatrix(mx,spm1);

//显示三元组矩阵

SpmDisplay(spm1);

//将三元组转置存放到spm2中

Transpmatrix(spm1,spm2);

//显示转置后的三元组

SpmDisplay(spm2);

return

0;

}

以上就是关于关于稀疏矩阵三元组的转置全部的内容,包括:关于稀疏矩阵三元组的转置、C语言课程设计:稀疏矩阵应用 要求:实现三元组,十字链表下的稀疏矩阵的加、转、乘的实现。、利用稀疏矩阵的顺序存储实现稀疏矩阵的加、减、乘、转置等简单运算。 这是课题要求,求大佬用c语言。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9289843.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存