编写用“三元组表”存储稀疏矩阵,进行矩阵处理的程序。实现(1)矩阵转置 (2)矩阵相加

编写用“三元组表”存储稀疏矩阵,进行矩阵处理的程序。实现(1)矩阵转置 (2)矩阵相加,第1张

矩阵加减注意格式

#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;

}

: 三元表达式比如说bool b=true;int i=b10:20; 先判断b是否为真,如果b为true,i的结果就是10,如果b为false,i的结果就是20给出的程序是结果是10

限制到2位小数,得算好几天吧~就算是整数,一般算法的话,-1000~1000也得好几个小时。我是没时间调试了,我弄了个-100~100的,楼主的CPU如果先进的话,把下面代码中的上限下限改一改试试吧。

代码如下。

====================

Option Explicit

Private Const a = -100 '下限

Private Const b = 100 '上限

Dim x As Integer, y As Integer, z As Integer

Private Sub Form_Load()

Open "d:\1txt" For Output As 1

For x = a To b

For y = a To b

For z = a To b

If x + CSng(y) y + z ^ 3 = 0 Then Print #1, x, y, z

Next

Next

Next

Close

MsgBox "计算完毕,已经输出到D:\1txt ,请查看"

End

End Sub

兄弟,你在fun函数中的t是局部变量,也就是说你并没有为全局变量分配内存。要这样改:

status fun(int t,int v1,int v2,int v3)

{

t=(int )malloc(3sizeof(int));

if(!(t))exit(OVERFLOW);

(t)[0]=v1;(t)[1]=v2;(t)[2]=v3;

return OK;

}

调用时:

fun(&t,v1,v2,v3);

像这种问题Matlab库函数直接可以求解。

编写三个m文件,一个主程序,两个function

主程序mainm

p0=[0 0 0];

A=[];b=[];Aeq=[];beq=[];vlb=[-2;-2;-2];vub=[2;2;2];

[x,fval]=fmincon('fun_u',p0,A,b,Aeq,beq,vlb,vub,'confun_u')

fun_um子函数即目标函数u

function y=fun_u(x)

y= (x(1)-01)^2 + (x(2) - 04)^2 + (x(3) - 03)^2;

约束条件confun_um文件,由于本问题无约束条件,所以该函数这样来写

function [g,ceq]=confun_u(x)

g=-1;

ceq=-1;

执行的时候直接运行main程序即可。当然你可以把mainm也改为一个function,输入参数为目标函数名‘fname’,这时你需要自己定义'fname'的内容。要是不清楚的地方可以继续追问

用fsolve可解出来:

先构造函数:

function output=solveproblem(X)

c=X(1);

m=X(2);

y=X(3);

output(1)=(1-c)(1-y)(1-m)1061+y(1-c)(1-m)3056+c(1-y)(1-m)6067+m(1-c)(1-y)095+ym(1-c)2845+yc(1-m) 819+cm(1-y) 251+c ym 7669-321

output(2)=(1-c)(1-y)(1-m)1521+y(1-c)(1-m)1458+c(1-y)(1-m)652+m(1-c)(1-y)096+ym(1-c)1423+yc(1-m) 1741+cm(1-y) 162+my c8032

output(3)=(1-c)(1-y)(1-m)4477+y(1-c)(1-m)99+c(1-y)(1-m)397+m(1-c)(1-y)078+ym(1-c)08+yc(1-m) 33+cm(1-y) 795+ mcy6679

然后求解:

x0=[1 1 1]; %初值

ans1 = ones(20,3);

options=optimset('fsolve');

for k=1:20

[x,fval,exitflag,output]=fsolve(@solveproblem,x0,options);

x0=x;

ans1(k,:)=x;

end

ans1 =

-02892 09143 01893

带入三个方程验证,分别等于00012,48363e-004,-00016

以上就是关于编写用“三元组表”存储稀疏矩阵,进行矩阵处理的程序。实现(1)矩阵转置 (2)矩阵相加全部的内容,包括:编写用“三元组表”存储稀疏矩阵,进行矩阵处理的程序。实现(1)矩阵转置 (2)矩阵相加、.C#中的三元表达式是什么、求三元方程的解,用vb编一个程序,有知道的,能给我提个思路,或者资料也行。拜谢了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存