c语言矩阵计算器(c++矩阵运算函数)

今天给各位分享c语言矩阵计算器的知识,其中也会对c++矩阵运算函数进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

1、计算器实验C语言2、用c语言怎么编写输入一个矩阵求其逆矩阵的程序?3、c语言编程。两个5*5矩阵相乘4、如何用C语言编写一个科学计算器5、用c语言编写一个计算器6、一个有关向量与矩阵的实用计算器程序

计算器实验C语言

#include stdio.h

int number,number2,result;

int main(void)

{

puts(“欢迎使用二位数计算程序,按下回车键确定!”);

puts(“\n请分别输入二个任意整数值!”);

scanf(“%d %d”,number,number2);

result=number+number2;

printf(“(加法计算)计算结果=%d\n”,result);

result=number*number2;

printf(“(乘法计算)计算结果=%d\n”,result);

result=number/number2;

printf(“(除法计算)计算结果=%d\n”,result);

system(“echo.pause”);

return 0;

}

c语言矩阵计算器(c++矩阵运算函数)

用c语言怎么编写输入一个矩阵求其逆矩阵的程序?

这是我编的一个简易矩阵计算器,C++语言,非常容易理解的,你可以参考求行列式和逆部分

#include iostream

#include iomanip

#include conio.h

#include “windows.h”

#include string

using namespace std;

void gotoxy(int x,int y) // 列x: 0~79 行y: 0~24

{ HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);

COORD coordScreen={x,y};

SetConsoleCursorPosition(hConsole,coordScreen);

return;

}

void setcolor(unsigned short ForeColor,unsigned short BackColor)

// 0–黑 1–暗蓝 2–暗绿 3–暗青 4–暗红 5–暗紫 6–蟹黄 7–暗白

// 8–灰 9–亮蓝 10-亮绿 11-亮青 12-亮红 13-亮紫 14-黄 15-亮白

{ HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute(hCon,(ForeColor % 16)|(BackColor % 16 * 16));

};

int main()

{

void plu();

void sub();

void amo();

void mul();

void ran();

void ord();

char sel=’1′;

while(sel != ‘0’)

{ int i;

system(“cls”); // 清屏

setcolor(15,0); // 下面显示黑底亮青字

gotoxy(8,1); cout”┌───────────────────────────┐”;

for(i=2;i20;i++)

{gotoxy(8,i);cout”│”;gotoxy(64,i);cout”│”;}

setcolor(15,6); // 下面显示红底白字

gotoxy(10,3); cout” “;

gotoxy(10,4); cout” 简 易 矩 阵 计 算 器 “;

gotoxy(10,5); cout” “;

setcolor(15,0); // 下面显示黑底亮青字

gotoxy(10,7); cout” 1 —- 矩阵加法 2 —- 矩阵减法 “;

gotoxy(10,9); cout” 3 —- 矩阵数乘 4 —- 矩阵乘法 “;

gotoxy(10,11); cout” 5 —- 矩阵行列式 6 —- 矩阵的逆 “;

gotoxy(10,13); cout” 0 —- 退出 “;

gotoxy(10,15); cout” 请选择(0–6):”;

gotoxy(8,20); cout”└───────────────────────────┘”;

do

{ gotoxy(28,15); sel=getche( );}

while ( sel!=’1′ sel!=’2′ sel!=’3′ sel!=’4′ sel!=’5′ sel!=’6′ sel!=’0′);

switch(sel)

{

case ‘1’:plu(); break;

case ‘2’:sub(); break;

case ‘3’:amo(); break;

case ‘4’:mul(); break;

case ‘5’:ran(); break;

case ‘6’:ord(); break;

case ‘0’: break;

}

}

system(“cls”);

gotoxy(25,10);

cout”谢 谢 使 用 系 统 !”endl;

return 0;

}

void plu()//加法

{ char l;

system(“cls”); // 清屏

setcolor(14,0); // 下面用黑底黄字

int a,b,i,j;

gotoxy(0,0);cout” 矩阵加法 “;

gotoxy(0,2);cout”请输入矩阵的行数:”;

cina;

coutendl;

cout”请输入矩阵的列数:”;

cinb;

coutendl;

double m[10][10],n[10][10];

cout”请输入第一个矩阵:”endl;

for(i=0;ia;i++)

for(j=0;jb;j++)

{gotoxy(6*j+20,2*i+6); cinm[i][j];}

coutendlendl”请输入第二个矩阵:”endl;

for(i=0;ia;i++)

for(j=0;jb;j++)

{gotoxy(6*j+20,2*a+2*i+7);cinn[i][j];}

coutendl””endl”矩阵加法结果为:”;

for(i=0;ia;i++)

for(j=0;jb;j++)

{gotoxy(6*j+20,4*a+2*i+8);coutm[i][j]+n[i][j];}

gotoxy(0,6*a+9);

cout”按任意键退出:”;

l=getche();

}

void sub()//减法

{ char l;

system(“cls”); // 清屏

setcolor(14,0); // 下面用黑底黄字

int a,b,i,j;

gotoxy(0,0);cout”矩阵减法”;

gotoxy(0,2);cout”请输入矩阵的行数:”;

cina;

coutendl;

cout”请输入矩阵的列数:”;

cinb;

coutendl;

double m[10][10],n[10][10];

cout”请输入第一个矩阵:”endl;

for(i=0;ia;i++)

for(j=0;jb;j++)

{gotoxy(6*j+20,2*i+6); cinm[i][j];}

coutendlendl”请输入第二个矩阵:”endl;

for(i=0;ia;i++)

for(j=0;jb;j++)

{gotoxy(6*j+20,2*a+2*i+7);cinn[i][j];}

coutendl””endl”矩阵减法结果为:”;

for(i=0;ia;i++)

for(j=0;jb;j++)

{gotoxy(6*j+20,4*a+2*i+8);coutm[i][j]-n[i][j];}

gotoxy(0,6*a+9);

cout”按任意键退出:”;

l=getche();

}

void amo()//数乘

{ char h;

system(“cls”); // 清屏

setcolor(14,0); // 下面用黑底黄字

int a,b,i,j;

gotoxy(0,0);cout”矩阵数乘”;

gotoxy(0,2);cout”请输入矩阵的行数:”;

cina;

coutendl;

cout”请输入矩阵的列数:”;

cinb;

coutendl;

double m[10][10],c;

cout”请输入矩阵:”endl;

for(i=0;ia;i++)

for(j=0;jb;j++)

{gotoxy(6*j+20,2*i+6);cinm[i][j];}

coutendl”请输入与矩阵相乘的实数:”;

cinc;

coutendlendl”矩阵数乘结果为:”;

for(i=0;ia;i++)

for(j=0;jb;j++)

{gotoxy(8*j+20,2*a+2*i+9);coutm[i][j]*c;}

gotoxy(0,4*a+12);

cout”按任意键退出:”;h=getche();

}

void mul()//乘法

{

char k;

system(“cls”); // 清屏

setcolor(14,0); // 下面用黑底黄字

int a,b,c,i,j,q;

gotoxy(0,0);cout”矩阵乘法”;

gotoxy(0,2);cout”请输入第一个矩阵的行数:”;

cina;

coutendl”请输入第一个矩阵的列数:”;

cinb;

coutendl”则第二个矩阵的行数也为:”b;

coutendlendl”请输入第二个矩阵的列数:”;

cinc;

coutendl;

double m[10][10],n[10][10],p[10][10]={0};

cout”请输入第一个矩阵:”endl;

for(i=0;ia;i++)

for(j=0;jb;j++)

{gotoxy(6*j+18,2*i+10); cinm[i][j];}

coutendlendl”请输入第二个矩阵:”;

for(i=0;ib;i++)

for(j=0;jc;j++)

{gotoxy(6*j+18,2*a+2*i+11);cinn[i][j];}

coutendl””endl”矩阵相乘结果为: “;

for(i=0;ia;i++)

for(j=0;jc;j++)

for(q=0;qb;q++) p[i][j]=p[i][j]+m[i][q]*n[q][j];

for(i=0;ia;i++)

for(j=0;jc;j++)

{gotoxy(10*j+18,2*a+2*b+2*i+12);coutp[i][j];}

gotoxy(16,2*a+2*b+2*i+15);

cout”按任意键退出:”;k=getche();

}

//===================================================行列式

float Fun(int n1,float a1[10][10]);

void ran()

{

system(“cls”); // 清屏

setcolor(15,0); // 下面用黑底黄字

char k;

int n,i,j;

cout”矩阵行列式”endlendl”请输入矩阵阶数: “;

cinn;

coutendl”请输入矩阵:”endl;

float a[10][10];

for(i=0;in;i++)

for(j=0;jn;j++)

{gotoxy(6*j+12,2*i+4);cina[i][j];}

coutendl”行列式为: “Fun(n,a)endlendl;

cout”按任意键退出:”;

k=getche();

}

float Fun(int n1,float a1[10][10])//求行列式的递归函数

{

int i_1,j_1,c;//c为数组b的行

float b[10][10];

int p=0,q=0;

float sum=0;

if(n1==1) return a1[0][0];

for(i_1=0;i_1n1;i_1++)

{

for(c=0;cn1-1;c++)

{if(ci_1) p=0;

else p=1;

for(j_1=0;j_1n1-1;j_1++)

{b[c][j_1]=a1[c+p][j_1+1];}

}

if(i_1%2==0)

q=1;

else q=(-1);

sum=sum+a1[i_1][0]*q*Fun(n1-1,b);

}return sum;

}

//================================================================

void ord()

{

char g;

system(“cls”); // 清屏

setcolor(15,0); // 下面用黑底黄字

int i,j,n;

gotoxy(0,0);cout”矩阵的逆”;

gotoxy(0,2);cout”请输入矩阵的阶数:”;

cinn;

coutendl;

cout”请输入矩阵:”;

float l[10][10],m[10][10],p;

for(i=0;in;i++)

for(j=0;jn;j++)

{gotoxy(4*j+12,2*i+4); cinl[i][j];}

if(Fun(n,l)==0) coutendl”该矩阵无逆!!!”endl;

else

{p=Fun(n,l);

coutendl”矩阵的逆为: “;

for(i=0;in;i++)

for(j=0;jn;j++)

{{float f[10][10];

int r,w,e,d;//e为数组f的行数

for(int j_1=0,e=0;j_1n-1,en-1;j_1++,e++)

for(int i_1=0,d=0;i_1n-1,dn-1;i_1++,d++)

{if(ei) r=0;else r=1;

if(dj) w=0;else w=1;

f[i_1][j_1]=l[i_1+w][j_1+r];};

if((i+j)%2==0) m[i][j]=Fun(n-1,f)/p;

else m[i][j]=-Fun(n-1,f)/p;

};

gotoxy(9*j+12,2*n+2*i+4);coutm[i][j];};};

coutendlendl”按任意键退出:”;g=getche();

}

c语言编程。两个5*5矩阵相乘

#include “stdio.h”

const int MAX=5;

void multi(int a[MAX][MAX],int b[MAX][MAX],int c[MAX][MAX])

{

int i,j,k;

for(i=0;iMAX;i++)for(j=0;jMAX;j++)c[i][j]=0;//初值化

for(i=0;iMAX;i++)//按照书上的公式,乘起来,结果放在C数组里

{

for(j=0;jMAX;j++)

{

for(k=0;kMAX;k++)

{

c[i][j]+=a[i][k]*b[k][j];

}

}

}

}

void out(int x[MAX][MAX],int n)//输入矩阵

{

int i,j;

for(i=0;in;i++)

{

for(j=0;jn;j++)

printf(“%d “,x[i][j]);

puts(“”);

}

}

void read(int x[MAX][MAX],int n)

{

int i,j;

for(i=0;in;i++)for(j=0;jn;j++)scanf(“%d”,x[i][j]);

}

int main()

{

int a[MAX][MAX],b[MAX][MAX],c[MAX][MAX];

read(a,MAX);//读入矩阵

read(b,MAX);

out(c,MAX);

return 0;

}

如何用C语言编写一个科学计算器

用栈 就可以办到了。。。这个很详细的, lz 随便输入一个表达式,中间的计算过程全部输出了,lz试两个 就知道怎么回事了。 #include stdio.h

#include stdlib.h

#include string.h

#define MAXSIZE 4000;

typedef struct

{

char data[10];

int top;//头地址

int base;//基地址

int length;//长度

}Stack;

void init(Stack *st)//初始化栈

{

st-base=0;

st-top=0;

st-length=0;

}

int isEmpty(Stack *st)

{

int n=0,top,base;

top =st-top;

base =st-base;

if(top==base)

{

return 1;

}

return n;

}

int isFull(Stack *st)

{

int n=0,top,base;

top =st-top;

if(top=4000)

{

return 1;

}

return n;

}

char getTop(Stack *st)// 返回top值,不改变栈的结构

{

char n;

if(isEmpty(st))

{

printf(“栈为空\n”);

return 0;

}

int positon= st-top-1;

n= st-data[positon];//取出数据;

return n;

}

char pop(Stack *st)// 出栈,返回

{

char n;

if(isEmpty(st))

{

printf(“栈为空\n”);

return 0;

}

int positon= st-top-1;

n= st-data[positon];//取出数据;

st-top–;

st-length–;

st-data[positon]=’\0′;//消除数据

return n;

}

void push(char n,Stack *st)//入栈

{

int positon ;

if(isFull(st))

{

printf(“栈满\n”);

}

else

{

positon= st-top;//获取位置

st-data[positon]=n;//存入数据

st-top++;//改变位置

}

}

void show(Stack *m1)//输出栈中的数据

{

int top,base;

top=m1-top;

base=m1-base;

while(topbase)

{

printf(“%c,”,m1-data[–top]);

}

printf(“\n”);

}

int isOperate(char temp)//是否是操作符

{

if(temp==’+’||temp==’-‘||temp==’*’||temp==’/’||temp=='(‘||temp==’)’||temp==’#’)

{

return 1;

}

return 0;

}

int isValue(char temp)//是否是数值

{

if(temp=’0’temp=’9′)//

{

return 1;

}

else

{

return 0;

}

}

int isAvail(char temp)//是否有效字符

{

if(isOperate(temp)||isValue(temp))//如果temp既不是操作符和数值的话,则它是非法的

{

return 1;

}

return 0;

}

int detect(char temp)//搜索矩阵位置

{

int i=0;

char oper[7]={‘+’,’-‘,’*’,’/’,'(‘,’)’,’#’};

for(i=0;i7;i++)

{

if(temp==oper[i])

{

return i;

}

}

}

char Priority(char temp,char optr)//判断优先级

{

/**//*

+ – * / ( ) #

1 2 3 4 5 6 7

+ 1

– 2

* 3

/ 4

( 5 = 0

) 6 = 0

# 7 0 =

*/

int row ,col;

char priority[7][7]={/**//* + – * / ( ) # */

{”,”,”,”,”,”,”},

{”,”,”,”,”,”,”},

{”,”,”,”,”,”,”},

{”,”,”,”,”,”,”},

{”,”,”,”,”,’=’,”},

{”,”,”,”,’=’,’0′,”},

{”,”,”,”,”,”,’=’},

};

row = detect(temp);//找出对应的矩阵下标;

col = detect(optr);

// printf(“%d,%d”,row,col);

//优先级存储在一个7×7的矩阵中,对应关系上图;

return priority[row][col];

}

char evaluate(int a,int b,char oper)

{

switch(oper)

{

case ‘+’: return a+b+’0′;

case ‘-‘: return a-b+’0’;

case ‘*’: return a*b+’0′;

case ‘/’: return a/b+’0′;

default : return 0+’0′;

}

}

int calculateExpress(char *express)//计算表达式

{

int result=0;

int a,b;

// char oper,result;

Stack OPTR,OPND;//OPTR存储操作符,OPND操作数值

init(OPTR);

init(OPND);

push(‘#’,OPTR);//默认第一个位’#’

////////////////////-算法-////////////////////////////

while(*express!=’\0′)

{

char temp;

temp= *(express);

printf(“———————————\n”);

printf(“当前的符号为%c\n”,temp);

if(isAvail(temp))//是否是有效字符

{

if(isOperate(temp) )//输入的是操作符

{

char oper,result;

char optr = getTop(OPTR);//栈中top位的操作符

printf(“栈顶操作符位:%c\n”,optr);

char prior = Priority(temp,optr);//判断优先级

switch(prior)

{

case ”:

push(temp,OPTR);

printf(“将符号位%c入栈\n”,temp);

express++;

break;

case ”:

//int a,b;

//char oper,result;

a=pop(OPND)-‘0’;//存在栈中的都是char字符

b=pop(OPND)-‘0’;

oper=pop(OPTR);

result=evaluate(b,a,oper);//出栈一个操作符,计算结果

//printf(“%d”,result-‘0’);

push(result,OPND);//结果入OPND

printf(“%d%c%d结果为:%d\n”,b,oper,a,result-‘0’);

break;

case ‘=’:

//消除括号

pop(OPTR);

printf(“消除括号\n”);

express++;

break;

}

}

if(isValue(temp))//输入的是数值

{

push(temp,OPND);//将数值位入栈;

express++;

printf(“将数值%c压入栈\n”,temp);

//show(OPND);

}

}

else //表达式中有非法字符

{

printf(“表达式中有非法字符\n”);

exit(-1);//退出程序

}

}

// show(OPND);

// show(OPTR);

return getTop(OPND)-‘0’;

}

void inputExpress(char *express)//输入表达式

{

int length=0;

printf(“请输入一个表达式:”);

scanf(“%s”,express);

int len =strlen(express);

express[len]=’#’;//表达式最后一位默认为’#’;

express[len+1]=’\0′;

}

void output(char *express,int result)//输出表达式

{

int i=0;

printf(“—————————————-\n表达式:”);

while(express[i]!=’#’)

{

printf(“%c”,express[i]);

i++;

}

printf(“=%d\n”,result);

}

int main()

{

char express[100];//表达式

int result =0;

inputExpress(express);//输入表达式

result = calculateExpress(express);//计算表达式;

output(express,result); //输出表达式

//、、、、、、、、、、、、、测试优先级。

/**//*

char m=’7′ ;

m=Priority(‘+’,’*’);

printf(“优先级为%c”,m);

int m=evaluate(5,6,’m’);

printf(“%d”,m);

*/

return 0;

}

用c语言编写一个计算器

先简单给你写了一下,你先看看行不行,太晚了,我得睡啦,要是不明白,明天追问就行:

#include stdio.h

int main()

{

int a,b;

char c;

while(

//这里是逗号表达式,如果看起来别扭可以改到while循环外

printf(“请输入1个式子(输入q退出):\n”),

scanf(“%d%c%d”,a,c,b)==3

)

{

//先给你写了加减乘除,当然这里也可以采用switch

if(c==’+’) printf(“%d\n”,a+b);//加

else if(c==’-‘) printf(“%d\n”,a-b);//减

else if(c==’*’) printf(“%d\n”,a*b);//乘

else if(c==’/’) printf(“%d\n”,a/b);//除

}

return 0;

}

一个有关向量与矩阵的实用计算器程序

//数值计算程序-特征值和特征向量

//////////////////////////////////////////////////////////////

//约化对称矩阵为三对角对称矩阵

//利用Householder变换将n阶实对称矩阵约化为对称三对角矩阵

//a-长度为n*n的数组,存放n阶实对称矩阵

//n-矩阵的阶数

//q-长度为n*n的数组,返回时存放Householder变换矩阵

//b-长度为n的数组,返回时存放三对角阵的主对角线元素

//c-长度为n的数组,返回时前n-1个元素存放次对角线元素

void eastrq(double a[],int n,double q[],double b[],double c[]);

//////////////////////////////////////////////////////////////

//求实对称三对角对称矩阵的全部特征值及特征向量

//利用变型QR方法计算实对称三对角矩阵全部特征值及特征向量

//n-矩阵的阶数

//b-长度为n的数组,返回时存放三对角阵的主对角线元素

//c-长度为n的数组,返回时前n-1个元素存放次对角线元素

//q-长度为n*n的数组,若存放单位矩阵,则返回实对称三对角矩阵的特征向量组

// 若存放Householder变换矩阵,则返回实对称矩阵A的特征向量组

//a-长度为n*n的数组,存放n阶实对称矩阵

int ebstq(int n,double b[],double c[],double q[],double eps,int l);

//////////////////////////////////////////////////////////////

//约化实矩阵为赫申伯格(Hessen berg)矩阵

//利用初等相似变换将n阶实矩阵约化为上H矩阵

//a-长度为n*n的数组,存放n阶实矩阵,返回时存放上H矩阵

//n-矩阵的阶数

void echbg(double a[],int n);

//////////////////////////////////////////////////////////////

//求赫申伯格(Hessen berg)矩阵的全部特征值

//返回值小于0表示超过迭代jt次仍未达到精度要求

//返回值大于0表示正常返回

//利用带原点位移的双重步QR方法求上H矩阵的全部特征值

//a-长度为n*n的数组,存放上H矩阵

//n-矩阵的阶数

//u-长度为n的数组,返回n个特征值的实部

//v-长度为n的数组,返回n个特征值的虚部

//eps-控制精度要求

//jt-整型变量,控制最大迭代次数

int edqr(double a[],int n,double u[],double v[],double eps,int jt);

//////////////////////////////////////////////////////////////

//求实对称矩阵的特征值及特征向量的雅格比法

//利用雅格比(Jacobi)方法求实对称矩阵的全部特征值及特征向量

//返回值小于0表示超过迭代jt次仍未达到精度要求

//返回值大于0表示正常返回

//a-长度为n*n的数组,存放实对称矩阵,返回时对角线存放n个特征值

//n-矩阵的阶数

//u-长度为n*n的数组,返回特征向量(按列存储)

//eps-控制精度要求

//jt-整型变量,控制最大迭代次数

int eejcb(double a[],int n,double v[],double eps,int jt);

//////////////////////////////////////////////////////////////

选自徐世良数值计算程序集(C)

每个程序都加上了适当地注释,陆陆续续干了几个月才整理出来的啊。

今天都给贴出来了

#include “stdio.h”

#include “math.h”

//约化对称矩阵为三对角对称矩阵

//利用Householder变换将n阶实对称矩阵约化为对称三对角矩阵

//a-长度为n*n的数组,存放n阶实对称矩阵

//n-矩阵的阶数

//q-长度为n*n的数组,返回时存放Householder变换矩阵

//b-长度为n的数组,返回时存放三对角阵的主对角线元素

//c-长度为n的数组,返回时前n-1个元素存放次对角线元素

void eastrq(double a[],int n,double q[],double b[],double c[])

{

int i,j,k,u,v;

double h,f,g,h2;

for (i=0; i=n-1; i++)

{

for (j=0; j=n-1; j++)

{

u=i*n+j; q[u]=a[u];

}

}

for (i=n-1; i=1; i–)

{

h=0.0;

if (i1)

{

for (k=0; k=i-1; k++)

{

u=i*n+k;

h=h+q[u]*q[u];

}

}

if (h+1.0==1.0)

{

c[i-1]=0.0;

if (i==1)

{

c[i-1]=q[i*n+i-1];

}

b[i]=0.0;

}

else

{

c[i-1]=sqrt(h);

u=i*n+i-1;

if (q[u]0.0)

{

c[i-1]=-c[i-1];

}

h=h-q[u]*c[i-1];

q[u]=q[u]-c[i-1];

f=0.0;

for (j=0; j=i-1; j++)

{

q[j*n+i]=q[i*n+j]/h;

g=0.0;

for (k=0; k=j; k++)

{

g=g+q[j*n+k]*q[i*n+k];

}

if (j+1=i-1)

{

for (k=j+1; k=i-1; k++)

{

g=g+q[k*n+j]*q[i*n+k];

}

}

c[j-1]=g/h;

f=f+g*q[j*n+i];

}

h2=f/(h+h);

for (j=0; j=i-1; j++)

{

f=q[i*n+j];

g=c[j-1]-h2*f;

c[j-1]=g;

for (k=0; k=j; k++)

{

u=j*n+k;

q[u]=q[u]-f*c[k-1]-g*q[i*n+k];

}

}

b[i]=h;

}

}

b[0]=0.0;

for (i=0; i=n-1; i++)

{

if ((b[i]!=0.0)(i-1=0))

{

for (j=0; j=i-1; j++)

{

g=0.0;

for (k=0; k=i-1; k++)

{

g=g+q[i*n+k]*q[k*n+j];

}

for (k=0; k=i-1; k++)

{

u=k*n+j;

q[u]=q[u]-g*q[k*n+i];

}

}

}

u=i*n+i;

b[i]=q[u];

q[u]=1.0;

if (i-1=0)

{

for (j=0; j=i-1; j++)

{

q[i*n+j]=0.0;

q[j*n+i]=0.0;

}

}

}

return;

//求实对称三对角对称矩阵的全部特征值及特征向量

//利用变型QR方法计算实对称三对角矩阵全部特征值及特征向量

//n-矩阵的阶数

//b-长度为n的数组,返回时存放三对角阵的主对角线元素

//c-长度为n的数组,返回时前n-1个元素存放次对角线元素

//q-长度为n*n的数组,若存放单位矩阵,则返回实对称三对角矩阵的特征向量组

// 若存放Householder变换矩阵,则返回实对称矩阵A的特征向量组

//a-长度为n*n的数组,存放n阶实对称矩阵

int ebstq(int n,double b[],double c[],double q[],double eps,int l)

{

int i,j,k,m,it,u,v;

double d,f,h,g,p,r,e,s;

c[n-1]=0.0;

d=0.0;

f=0.0;

for (j=0; j=n-1; j++)

{

it=0;

h=eps*(fabs(b[j])+fabs(c[j]));

if (hd)

{

d=h;

}

m=j;

while ((m=n-1)(fabs(c[m])d))

{

m=m+1;

}

if (m!=j)

{

do

{

if (it==l)

{

printf(“fail\n”);

return(-1);

}

it=it+1;

g=b[j];

p=(b[j+1]-g)/(2.0*c[j]);

r=sqrt(p*p+1.0);

if (p=0.0)

{

b[j]=c[j]/(p+r);

}

else

{

b[j]=c[j]/(p-r);

}

h=g-b[j];

for (i=j+1; i=n-1; i++)

{

b[i]=b[i]-h;

}

f=f+h;

p=b[m];

e=1.0;

s=0.0;

for (i=m-1; i=j; i–)

{

g=e*c[i];

h=e*p;

if (fabs(p)=fabs(c[i]))

{

e=c[i]/p;

r=sqrt(e*e+1.0);

c[i+1]=s*p*r;

s=e/r;

e=1.0/r;

}

else

{

e=p/c[i];

r=sqrt(e*e+1.0);

c[i+1]=s*c[i]*r;

s=1.0/r;

e=e/r;

}

p=e*b[i]-s*g;

b[i+1]=h+s*(e*g+s*b[i]);

for (k=0; k=n-1; k++)

{

u=k*n+i+1;

v=u-1;

h=q[u];

q[u]=s*q[v]+e*h;

q[v]=e*q[v]-s*h;

}

}

c[j]=s*p;

b[j]=e*p;

}

while (fabs(c[j])d);

}

b[j]=b[j]+f;

}

for (i=0; i=n-1; i++)

{

k=i; p=b[i];

if (i+1=n-1)

{

j=i+1;

while ((j=n-1)(b[j]=p))

{

k=j;

p=b[j];

j=j+1;

}

}

if (k!=i)

{

b[k]=b[i];

b[i]=p;

for (j=0; j=n-1; j++)

{

u=j*n+i;

v=j*n+k;

p=q[u];

q[u]=q[v];

q[v]=p;

}

}

}

return(1);

}

//约化实矩阵为赫申伯格(Hessen berg)矩阵

//利用初等相似变换将n阶实矩阵约化为上H矩阵

//a-长度为n*n的数组,存放n阶实矩阵,返回时存放上H矩阵

//n-矩阵的阶数

void echbg(double a[],int n)

{ int i,j,k,u,v;

double d,t;

for (k=1; k=n-2; k++)

{

d=0.0;

for (j=k; j=n-1; j++)

{

u=j*n+k-1;

t=a[u];

if (fabs(t)fabs(d))

{

d=t;

i=j;

}

}

if (fabs(d)+1.0!=1.0)

{

if (i!=k)

{

for (j=k-1; j=n-1; j++)

{

u=i*n+j;

v=k*n+j;

t=a[u];

a[u]=a[v];

a[v]=t;

}

for (j=0; j=n-1; j++)

{

u=j*n+i;

v=j*n+k;

t=a[u];

a[u]=a[v];

a[v]=t;

}

}

for (i=k+1; i=n-1; i++)

{

u=i*n+k-1;

t=a[u]/d;

a[u]=0.0;

for (j=k; j=n-1; j++)

{

v=i*n+j;

a[v]=a[v]-t*a[k*n+j];

}

for (j=0; j=n-1; j++)

{

v=j*n+k;

a[v]=a[v]+t*a[j*n+i];

}

}

}

}

return;

}

//求赫申伯格(Hessen berg)矩阵的全部特征值

//利用带原点位移的双重步QR方法求上H矩阵的全部特征值

//返回值小于0表示超过迭代jt次仍未达到精度要求

//返回值大于0表示正常返回

//a-长度为n*n的数组,存放上H矩阵

//n-矩阵的阶数

//u-长度为n的数组,返回n个特征值的实部

//v-长度为n的数组,返回n个特征值的虚部

//eps-控制精度要求

//jt-整型变量,控制最大迭代次数

int edqr(double a[],int n,double u[],double v[],double eps,int jt)

{

int m,it,i,j,k,l,ii,jj,kk,ll;

double b,c,w,g,xy,p,q,r,x,s,e,f,z,y;

it=0;

m=n;

while (m!=0)

{

l=m-1;

while ((l0)(fabs(a[l*n+l-1])eps*(fabs(a[(l-1)*n+l-1])+fabs(a[l*n+l]))))

{

l=l-1;

}

ii=(m-1)*n+m-1;

jj=(m-1)*n+m-2;

kk=(m-2)*n+m-1;

ll=(m-2)*n+m-2;

if (l==m-1)

{

u[m-1]=a[(m-1)*n+m-1];

v[m-1]=0.0;

m=m-1; it=0;

}

else if (l==m-2)

{

b=-(a[ii]+a[ll]);

c=a[ii]*a[ll]-a[jj]*a[kk];

w=b*b-4.0*c;

y=sqrt(fabs(w));

if (w0.0)

{

xy=1.0;

if (b0.0)

{

xy=-1.0;

}

u[m-1]=(-b-xy*y)/2.0;

u[m-2]=c/u[m-1];

v[m-1]=0.0; v[m-2]=0.0;

}

else

{

u[m-1]=-b/2.0;

u[m-2]=u[m-1];

v[m-1]=y/2.0;

v[m-2]=-v[m-1];

}

m=m-2;

it=0;

}

else

{

if (it=jt)

{

printf(“fail\n”);

return(-1);

}

it=it+1;

for (j=l+2; j=m-1; j++)

{

a[j*n+j-2]=0.0;

}

for (j=l+3; j=m-1; j++)

{

a[j*n+j-3]=0.0;

}

for (k=l; k=m-2; k++)

{

if (k!=l)

{

p=a[k*n+k-1];

q=a[(k+1)*n+k-1];

r=0.0;

if (k!=m-2)

{

r=a[(k+2)*n+k-1];

}

}

else

{

x=a[ii]+a[ll];

y=a[ll]*a[ii]-a[kk]*a[jj];

ii=l*n+l;

jj=l*n+l+1;

kk=(l+1)*n+l;

ll=(l+1)*n+l+1;

p=a[ii]*(a[ii]-x)+a[jj]*a[kk]+y;

q=a[kk]*(a[ii]+a[ll]-x);

r=a[kk]*a[(l+2)*n+l+1];

}

if ((fabs(p)+fabs(q)+fabs(r))!=0.0)

{

xy=1.0;

if (p0.0)

{

xy=-1.0;

}

s=xy*sqrt(p*p+q*q+r*r);

if (k!=l)

{

a[k*n+k-1]=-s;

}

e=-q/s;

f=-r/s;

x=-p/s;

y=-x-f*r/(p+s);

g=e*r/(p+s);

z=-x-e*q/(p+s);

for (j=k; j=m-1; j++)

{

ii=k*n+j;

jj=(k+1)*n+j;

p=x*a[ii]+e*a[jj];

q=e*a[ii]+y*a[jj];

r=f*a[ii]+g*a[jj];

if (k!=m-2)

{

kk=(k+2)*n+j;

p=p+f*a[kk];

q=q+g*a[kk];

r=r+z*a[kk];

a[kk]=r;

}

a[jj]=q;

a[ii]=p;

}

j=k+3;

if (j=m-1)

{

j=m-1;

}

for (i=l; i=j; i++)

{

ii=i*n+k;

jj=i*n+k+1;

p=x*a[ii]+e*a[jj];

q=e*a[ii]+y*a[jj];

r=f*a[ii]+g*a[jj];

if (k!=m-2)

{

kk=i*n+k+2;

p=p+f*a[kk];

q=q+g*a[kk];

r=r+z*a[kk];

a[kk]=r;

}

a[jj]=q;

a[ii]=p;

}

}

}

}

}

return(1);

}

//求实对称矩阵的特征值及特征向量的雅格比法

//利用雅格比(Jacobi)方法求实对称矩阵的全部特征值及特征向量

//返回值小于0表示超过迭代jt次仍未达到精度要求

//返回值大于0表示正常返回

//a-长度为n*n的数组,存放实对称矩阵,返回时对角线存放n个特征值

//n-矩阵的阶数

//u-长度为n*n的数组,返回特征向量(按列存储)

//eps-控制精度要求

//jt-整型变量,控制最大迭代次数

int eejcb(double a[],int n,double v[],double eps,int jt)

{

int i,j,p,q,u,w,t,s,l;

double fm,cn,sn,omega,x,y,d;

l=1;

for (i=0; i=n-1; i++)

{

v[i*n+i]=1.0;

for (j=0; j=n-1; j++)

{

if (i!=j)

{

v[i*n+j]=0.0;

}

}

}

while (1==1)

{

fm=0.0;

for (i=0; i=n-1; i++)

{

for (j=0; j=n-1; j++)

{

d=fabs(a[i*n+j]);

if ((i!=j)(dfm))

{

fm=d;

p=i;

q=j;

}

}

}

if (fmeps)

{

return(1);

}

if (ljt)

{

return(-1);

}

l=l+1;

u=p*n+q;

w=p*n+p;

t=q*n+p;

s=q*n+q;

x=-a[u];

y=(a[s]-a[w])/2.0;

omega=x/sqrt(x*x+y*y);

if (y0.0)

{

omega=-omega;

}

sn=1.0+sqrt(1.0-omega*omega);

sn=omega/sqrt(2.0*sn);

cn=sqrt(1.0-sn*sn);

fm=a[w];

a[w]=fm*cn*cn+a[s]*sn*sn+a[u]*omega;

a[s]=fm*sn*sn+a[s]*cn*cn-a[u]*omega;

a[u]=0.0;

a[t]=0.0;

for (j=0; j=n-1; j++)

{

if ((j!=p)(j!=q))

{

u=p*n+j;

w=q*n+j;

fm=a[u];

a[u]=fm*cn+a[w]*sn;

a[w]=-fm*sn+a[w]*cn;

}

}

for (i=0; i=n-1; i++)

{

if ((i!=p)(i!=q))

{

u=i*n+p;

w=i*n+q;

fm=a[u];

a[u]=fm*cn+a[w]*sn;

a[w]=-fm*sn+a[w]*cn;

}

}

for (i=0; i=n-1; i++)

{

u=i*n+p;

w=i*n+q;

fm=v[u];

v[u]=fm*cn+v[w]*sn;

v[w]=-fm*sn+v[w]*cn;

}

}

return(1);

}

c语言矩阵计算器的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c++矩阵运算函数、c语言矩阵计算器的信息别忘了在本站进行查找喔。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月29日 15:03:16
下一篇 2024年3月29日 15:14:33

相关推荐

  • c语言自定义函数数组求和,c语言自定义函数调用数组

    C语言数组怎样求和, 可以通过循环遍历数组中的每个元素,并进行累加。累加的结果可以保存在变量中,需要注意,要保证变量足够保存累加结果,不会出现溢出。 先获取数组长度,然后用for循环,从数组中获取值进行累加求和。 c语言中,定义数组后可以用sizeof命令获得数组的长度(即可容纳元素个数)。但是通过传递数组名参数到子函数中,以获得数组长度是不可行的,因为在子…

    2024年5月23日
    4500
  • excel2010翻译函数,excel函数翻译插件

    excel中翻译功能使用详解 1、嘿嘿,我有个笨办法 用&符号把你要翻译的内容连接到一个单元格里,中间加入逗号或者空格或者|,然后把文本复制到谷歌翻译。把翻译后的内容复制回来,用特定符号分列,再转置,复制到对应的位置,OK。 2、excel里面的内容可以直接复制到翻译软件里面翻译的。不用一格一格的复制。不过你要注意自己到时候不要弄混了,因为复制过去是…

    2024年5月23日
    4600
  • excel函数过滤重复名字,excel表怎么过滤重复姓名?

    如何在一个excel表格中查找重复的人名? excel表格中查看重复人名的方法大致有两种,具体方法操作如下所示: 方法一: 首先打开电脑,然后在电脑桌面中找到excel表格并打开。 打开之后,在excel表格中,点击上方菜单栏中的“数据”。 打开表格,选中需要筛选重复数据的单元格(一列、一行、多列、多行、多个单元格都可以),点击“开始”菜单下的“条件格式”,…

    2024年5月23日
    4700
  • c语言温度转换怎么写,编写温度转换函数c语言

    c语言编程,摄氏华氏温度转换 摄氏温度(℃)和华氏温度(℉)之间的换算关系为: 华氏度=摄氏度×8+32 摄氏度=(华氏度-32)÷8 5(华氏度-50)=9(摄氏度-10)。 摄氏温标(°C)和华氏温标(°F)之间的换算关系为:F=C×8+32。C=(F-32)÷8。C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式…

    2024年5月23日
    4100
  • c语言函数大全下载,c语言函数菜鸟教程

    在C语言中,要用到的函数都有哪些? http:// C语言函数大全,已包含绝大部分的函数。每个函数包含函数名,功能,用法,举例,内容详尽。 .double cos(double x); 余弦函数。14.double tan(double x); 正切函数。15.double asin(double x); 反正弦函数。16.double acos(doubl…

    2024年5月23日
    4700
  • c语言39039,递归函数C语言

    求问c语言大神能不能解释一下这个程序,感激不尽 简单的说,就是延时程序,根据函数名字也可以看出来。至于for循环中120,我推测可能是循环执行120次空语句的时间为1MS。向该函数传入ms,则可以使程序延时相应的时间。 第一二行代码:int i,j,n;long int t=1,sum=0;//定义了三个整数型(短整型)的变量,定义两个长整整型变量并初始化。…

    2024年5月23日
    5700
  • c语言bioskey()函数,c语言b=c

    c语言如何使用键盘上的上下左右键 1、上下左右 通常 作 功能键 使用,例如 在 编辑器 (notepad, word 之类),用来移动光标一行或一格使用。C语言 如果 想要输出 它们的键值,则需要 做点功课。 2、用百度查一下键盘扫描码,有解释,这里几句话说不清。它是一个16位码,分高8位和低8位,而getch()一次只能接收1个8位。 3、上下左右箭头产…

    2024年5月23日
    4400
  • excel销售数据统计,excel销售统计函数

    如何在EXCEL表中统计销售金额总数? 打开一个Excel文档,我们要依据已有的数据,进行每日累计销售额统计。把光标定位在C2单元格,在单元格中输入“=sum(C3,D2) ”。回车后就会得到9月1号的累计销售额。 首先在电脑上打开Excel表格后,选中任意有数据的单元区域,插入菜单,数据透视表快捷键。打开创建数据透视表对话框,确认数据透视区域,选择插入数据…

    2024年5月23日
    3900
  • excel如何写vba,excel如何写今天日期函数

    Excel怎么设置着写一个刷新的VBA? End Sub 然后保存并重新打开表格,数据每秒自动刷新。如果要不间断一直刷新,把 + TimeValue(00:00:01)去掉,但是会非常卡,无法操作。原创,Excel 2016 亲测可行。 LatestTime 可选 Variant 过程开始运行的最晚时间。 在A1输入\x0d\x0a=NOW()\x0d\x0…

    2024年5月23日
    4100
  • excel判断单元格为空函数,excel判断单元格为空函数怎么设置

    如何用IF函数判断一个单元格是不是空白单元格? 1、Excel判断单元格空值可以使用内置函数ISBLANK。 2、A1不为空白,等于1,否则等于2 =IF(ISNUMBER(A1),1,2)A1为数值,等于1,否则等于2。 3、如图1,我们要检查C列中工资为空白的单元格。在D2单元格填写if函数,并向下填充。此函数表明,如果D列中工资为空白,则会显示文字提示…

    2024年5月23日
    4500

发表回复

登录后才能评论



关注微信