語言只提供+,-,*,/等低級(jí)運(yùn)算功能,高級(jí)的都必須代碼實(shí)現(xiàn),包括次方開放運(yùn)算,都是編寫代碼實(shí)現(xiàn)。 你學(xué)過矩陣乘法,這就很容易,你需要定義一個(gè)結(jié)構(gòu)體,作為矩陣。。。。
我們提供的服務(wù)有:網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、承德ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的承德網(wǎng)站制作公司
矩陣很簡(jiǎn)單,行數(shù),列數(shù),元素。
typedef struct {
uint r,c;
float *d;
int size;
}matrix;
分別是行數(shù),列數(shù),數(shù)據(jù)指針,和數(shù)據(jù)最大長(zhǎng)度。數(shù)據(jù)最好用指針不用數(shù)組,是因?yàn)樵黾屿`活性,你只需要?jiǎng)討B(tài)申請(qǐng)內(nèi)存即可讓你的矩陣大小可變,數(shù)組長(zhǎng)度不可變。最后一個(gè)參數(shù)代表內(nèi)存長(zhǎng)度,最好是要有,方便你重新定義數(shù)組時(shí)看內(nèi)存夠不夠,不夠可以realloc,沒有的話你就不知道夠不夠(5*4的矩陣,乘以 4*5 矩陣必然變成5*5矩陣,賦值到新矩陣結(jié)構(gòu)體里,如果還是20個(gè)單位,顯然裝不下,必須realloc,所以該參數(shù)必須有)。。。
你只要實(shí)現(xiàn)個(gè)函數(shù) int mul(matrix *m1,*m2,*m3)即可,m1,m2分別為左右 矩陣,m3為結(jié)果。
按照運(yùn)算法則,你必須完成兩件事,判斷m1,m2是否可以相乘,不可以相乘返回一個(gè)錯(cuò)誤(比如返回-1),(3*3和4*4矩陣不能相乘),如果可以那就先讓m3.r=m1.r,m3.c=m2.c;
m3.d[i][j]=0;
for(k=0;km1.c;k++)
m3.d[i][j]+=m1.d[i][k]*m2.d[k][j];
這你就能到到m3的一個(gè)元素,那你只要求出所有的元素就得到新矩陣了。
不過因?yàn)槭荂語言,你要考慮內(nèi)存,m3也許內(nèi)存不夠長(zhǎng),你必須要做一下內(nèi)存長(zhǎng)度判斷,不夠長(zhǎng)要申請(qǐng),否則就報(bào)錯(cuò)沒法用了。。。所以size這個(gè)成員也是必須的。。
不過話說回來,如果是用C++,只要你寫一個(gè)矩陣類,重載運(yùn)算符 * ,你就可以用
m3=m1*m2; 這樣運(yùn)算,書寫更方便,但C語言沒這好事。
#includestdio.h
typedef struct
{
int m;
int n;
int array[100][100];
}Ju_def;
int main()
{
Ju_def Ju[11];
int i=0,m,n,k;
int flag[10];
while(1)
{
flag[i]=0;
printf("In put m and n:\n");
scanf("%d%d",Ju[i].m,Ju[i].n);
while(Ju[i].m=0||Ju[i].m100||Ju[i].n=0||Ju[i].m100)
{
printf("In put m and n again:\n");
scanf("%d%d",Ju[i].m,Ju[i].n);
}
printf("In put your array:\n");
for(m=0;mJu[i].m;m++)
{
for(n=0;nJu[i].n;n++)
{
scanf("%d",Ju[i].array[m][n]);
if(Ju[i].array[m][n]==0)
flag[i]++;
}
}
if(flag[i]==(Ju[i].m*Ju[i].n))//矩陣元素全為0才退出循環(huán)
{
flag[i]=1;
break;
}
else
flag[i]=0;
i++;
i=i%10;//超過10個(gè)矩陣,則又循環(huán)到第1個(gè)。
}
for(i=1;i10;i++)
{
if((Ju[i].m!=Ju[0].n)(flag[i]==0))
{
printf("Not satisfied the definition of matrix multiplication !\n");
return 0;
}
if(flag[i])
{
break;
}
for(m=0;mJu[0].m;m++)
{
for(n=0;nJu[0].n;n++)
{
Ju[10].array[m][n]=0;
for(k=0;kJu[i].m;k++)
{
Ju[10].array[m][n]+=Ju[0].array[m][n]*Ju[i].array[k][n];
}
Ju[0].array[m][n]=Ju[10].array[m][n];
}
}
}
for(m=0;mJu[0].m;m++)
{
for(n=0;nJu[0].n;n++)
{
printf("%-8d",Ju[0].array[m][n]);
}
printf("\n");
}
}
你試試這個(gè)我的矩陣乘法是這樣的了,A=A*B*C...(10個(gè)以內(nèi))。
#define?MAX?50
#define?M?MAX
#define?N?MAX
#define?T?MAX
#define?S?MAX
int?Mult(double?a[][N],int?m,int?n,double?b[][T]int?s,int?t,double?c[][T])?{
int?i,j,k;
if(n?!=?s)?{
printf("兩矩陣相乘,左矩陣的列數(shù)與右矩陣的行數(shù)必須相等。\n");
return?0;
}
int?c;
tmp.m_Mat?=?new?double?*[tmp.m_Rows];
for(int?i?=?0;i??tmp.m_Rows;i++)?tmp.m_Mat[i]?=?new?double[tmp.m_Cols];
for(i?=?0;?i??m;?++i)?{
for(j?=?0;?j??n;?++j)?{
c[i][j]?=?0;
for(k?=?0;?k??t;?++k)
c[i][j]?+=?c[i][k]?*?c[k][j];
}
}
return?1;
}
#include?"stdio.h"
#define?LANGA?4
#define?LANGB?3
#define?LANGC?LANGB
int?multi(double?A[][LANGA],double?B[][LANGB],double?C[][LANGC],int?langa,int?langb,int?langc){
int?i,j,k;
if(langa==LANGB??langb==LANGA){
for(i=0;ilanga;i++)
for(j=0;jlangc;j++)
for(C[i][j]=k=0;klangb;k++)
C[i][j]+=A[i][k]*B[k][j];
return?0;
}
return?-1;
}
int?main(int?argv,char?*argc[]){
double?A[LANGB][LANGA],B[LANGA][LANGB],C[LANGB][LANGC];
int?i,j;
for(i=0;iLANGB;i++)
for(j=0;jLANGA;A[i][j++]=1.0/(i+j+1));
for(i=0;iLANGA;i++)
for(j=0;jLANGB;B[i][j]=1.0+j++);
if(multi(A,B,C,LANGB,LANGA,LANGB))
return?-1;
for(i=0;iLANGB;i++){
for(j=0;jLANGC;printf("%12.4le",C[i][j++]));
printf("\n");
}
return?0;?
}
運(yùn)行樣例:
#include"stdio.h"
void?main()
{
int?a[3][2],b[2][3],c[3][3];
int?i,j,k;
for(i=0;i3;i++)//輸入
{
for(j=0;j2;j++)
scanf("%d",a[i][j]);
}
for(i=0;i2;i++)//輸入
{
for(j=0;j3;j++)
scanf("%d",b[i][j]);
}
for(i=0;i3;i++)//計(jì)算
{
for(j=0;j3;j++)
{
c[i][j]=0;//初始化c
for(k=0;k2;k++)
c[i][j]+=a[i][k]*b[k][j];
}
}
for(i=0;i3;i++)//輸出
{
for(j=0;j3;j++)
printf("%d?",c[i][j]);
printf("\n");
}
}
#include stdio.h
int main()
{
int x,y,z;
int i,j,l;
int sum=0;
printf("請(qǐng)輸入前一個(gè)矩陣的行數(shù),列數(shù)與后一個(gè)矩陣的列數(shù):\n");
scanf("%d %d %d",x,y,z);
int a[x][y];
int b[y][z];
int c[x][z];
//讀入矩陣
printf("請(qǐng)輸入矩陣a:\n");
for(i=0;ix;i++){
for(j=0;jy;j++){
scanf("%d",a[i][j]);
}
}
printf("請(qǐng)輸入矩陣b:\n");
for(i=0;iy;i++){
for(j=0;jz;j++){
scanf("%d",b[i][j]);
}
}
printf("矩陣a為:\n");
for(i=0;ix;i++){
for(j=0;jy;j++){
printf("%d",a[i][j]);
if(j==y-1)
printf("\n");
else
printf("\t");
}
}
printf("矩陣b為:\n");
for(i=0;iy;i++){
for(j=0;jz;j++){
printf("%d",b[i][j]);
if(j==z-1)
printf("\n");
else
printf("\t");
}
}
for(i=0;ix;i++){
for(l=0;lz;l++){
for(j=0;jy;j++){
sum+=a[i][j]*b[j][l];
if(j==y-1){
c[i][l]=sum,sum=0;
}
}
}
}
printf("矩陣a與矩陣b的乘積為:\n");
for(i=0;ix;i++){
for(j=0;jz;j++){
printf("%d",c[i][j]);
if(j==z-1)
printf("\n");
else
printf("\t");
}
}
return 0;
}