C語(yǔ)言線性代數(shù)算法實(shí)現(xiàn)矩陣示例代碼
C語(yǔ)言實(shí)現(xiàn)矩陣
矩陣作為一個(gè)結(jié)構(gòu)體而言,至少要包含行數(shù)、列數(shù)以及數(shù)據(jù)。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
int row, col, size;
double *data;
} Matrix;
特殊矩陣
接下來(lái)通過(guò)這個(gè)結(jié)構(gòu)體實(shí)現(xiàn)一些特殊的矩陣,例如包括相同元素的矩陣、對(duì)角矩陣等。
#define SetBase(mat) \
(Matrix*)malloc(sizeof(Matrix));\
mat->row = row;\
mat->col = col;\
mat->size = row*col;\
mat->data = (double*)malloc(mat->size*sizeof(double))
//特殊矩陣
Matrix* Sames(double n, int row, int col){
Matrix* mat = SetBase(mat);
for (int i = 0; i < mat->size; i++)
mat->data[i]=n;
return mat;
}
#define Ones(row,col) Sames(1,row,col)
#define Zeros(row,col) Sames(0,row,col)
Matrix* Diag(double n, int row, int col){
Matrix* mat = Sames(0,row,col);
for (int i = 0; i < min(row,col) ; i++)
mat->data[i*col+i] = n;
return mat;
}
#define Eye(row,col) Diag(1,row,col)
Matrix* CountMatrix(int row, int col){
Matrix* mat = SetBase(mat);
for (int i = 0; i < mat->size; i++)
mat->data[i]=i;
return mat;
}
//生成[L,R]范圍內(nèi)的隨機(jī)矩陣
Matrix* RandMat(int row,int col, double L, double R){
Matrix* mat = SetBase(mat);
int size=R-L;
for (int i = 0; i < mat->size; i++)
mat->data[i] = rand()%size+L;
return mat;
}
特殊矩陣驗(yàn)證
由于要識(shí)別輸入的函數(shù),所以先新建一個(gè)函數(shù)的結(jié)構(gòu)體
typedef struct{
char* name;
int len;
int numPara; //參數(shù)個(gè)數(shù)
double params[MAXLEN]; //參數(shù)列表
}Func;
然后通過(guò)字符串來(lái)生成Func
//用于識(shí)別函數(shù)
void initFunc(Func* func,char* str){
int i = -1;
int j = 0;
while(str[++i]!='('){}
func->len = i;
func->name = (char*)malloc(sizeof(char)*func->len);
for (j = 0; j < i; j++)
func->name[j] = str[j];
func->name[i] = '\0';
int start = ++i;
char temp[MAXLEN];
j = 0;
while (str[i]!=')')
{
if(str[i]==','){
temp[i-start]='\0';
start = i+1;
func->params[j]=atof(temp);
j++;
}else
temp[i-start]=str[i];
i++;
}
temp[i-start]='\0';
func->params[j]=atof(temp);
func->numPara = j+1;
}
接下來(lái)需要實(shí)現(xiàn)打印矩陣的函數(shù)
void printMat(Matrix* mat){
printf("mat:");
printf("%dx%d=%d\n",mat->col,mat->row,mat->size);
for (int i = 0; i < mat->size; i++)
{
printf("%f,",mat->data[i]);
if((i+1)%mat->col==0)
printf("\n");
}
}
最后是main函數(shù)
int isFunc(Func* func, char* str){
for (int i = 0; i < func->len; i++)
{
if(func->name[i]!=str[i])
return FALSE;
if(str[i]=='\0')
return FALSE;
}
return TRUE;
}
#define intPara (int)func->params
#define floatPara func->params
//#define isFunc(str) strcmp(func->name,str)
int main(){
//char* str = (char*)malloc(sizeof(char) * MAXLEN);
char str[MAXLEN];
Matrix* mat = NULL;
Func* func = (Func*)malloc(sizeof(func));
while(1)
{
printf("please input:");
gets(str);
initFunc(func,str);
if(isFunc(func,"Sames"))
mat = Sames(floatPara[0],intPara[1],intPara[2]);
else if(isFunc(func,"Ones"))
mat = Ones(intPara[0],intPara[1]);
else if(isFunc(func,"Zeros"))
mat = Zeros(intPara[0],intPara[1]);
else if(isFunc(func,"Diag"))
mat = Diag(floatPara[0],intPara[1],intPara[2]);
else if(isFunc(func,"Eye"))
mat = Eye(intPara[0],intPara[1]);
else if(isFunc(func,"CountMatrix"))
mat = CountMatrix(intPara[0],intPara[1]);
else if(isFunc(func,"RandMat"))
mat = RandMat(intPara[0],intPara[1],
floatPara[2],floatPara[3]);
else
continue;
printMat(mat);
}
}
驗(yàn)證一下
PS E:\Code\PL\calc> .\a.exe please input:Ones(4,4) mat:4x4=16 1.000000,1.000000,1.000000,1.000000, 1.000000,1.000000,1.000000,1.000000, 1.000000,1.000000,1.000000,1.000000, 1.000000,1.000000,1.000000,1.000000, please input:Zeros(3,5) mat:5x3=15 0.000000,0.000000,0.000000,0.000000,0.000000, 0.000000,0.000000,0.000000,0.000000,0.000000, 0.000000,0.000000,0.000000,0.000000,0.000000, please input:RandMat(3,3,0,100) mat:3x3=9 41.000000,67.000000,34.000000, 0.000000,69.000000,24.000000, 78.000000,58.000000,62.000000, please input:Eye(3,3) mat:3x3=9 1.000000,0.000000,0.000000, 0.000000,1.000000,0.000000, 0.000000,0.000000,1.000000, please input:CountMatrix(2,4) mat:4x2=8 0.000000,1.000000,2.000000,3.000000, 4.000000,5.000000,6.000000,7.000000,
以上就是C語(yǔ)言線性代數(shù)算法實(shí)現(xiàn)矩陣示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
c++中的內(nèi)聯(lián)函數(shù)inline用法實(shí)例
在本篇文章里小編給大家整理的是關(guān)于c++中的內(nèi)聯(lián)函數(shù)inline用法實(shí)例以及相關(guān)知識(shí)點(diǎn),有需要的朋友們學(xué)習(xí)下。2019-09-09
VC中LINK 2001 和 LINK 2009 的錯(cuò)誤的解決方法
最近將兩個(gè)開(kāi)源C++項(xiàng)目編譯成windows版本的時(shí)候遇到很多問(wèn)題,編譯的時(shí)候總是報(bào)錯(cuò),報(bào)的最多的是無(wú)法解析的外部符號(hào)”,經(jīng)過(guò)近3天的折騰總算都通過(guò)了,這里是一些總結(jié)2020-10-10
C++中vector類的一些簡(jiǎn)單實(shí)現(xiàn)
C++中的std::vector是一個(gè)動(dòng)態(tài)數(shù)組(也被稱為可變大小數(shù)組)的容器類,它是C++標(biāo)準(zhǔn)庫(kù)提供的其中一種容器類,提供了方便的操作和管理動(dòng)態(tài)數(shù)組的功能,本文就給大家介紹了C++中vector類的簡(jiǎn)單實(shí)現(xiàn)代碼,需要的朋友可以參考下2023-08-08
C++ 輸入一行數(shù)字(含負(fù)數(shù))存入數(shù)組中的案例
這篇文章主要介紹了C++ 輸入一行數(shù)字(含負(fù)數(shù))存入數(shù)組中的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12

