matrix.h和matrix.cpp有什么区别
Matrix.h包括矩阵类Matrix的定义,Matrix.cpp包括该类成员函数的实现。
一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。cpp文件里的东西都是相对独立的,在编译compile时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次链接(link)就行了。
怎样用Matlab调用已有的C语言程序
方法/步骤
准备好C语言程序,一般情况下要清楚C语言的入口函数,比如,如下的C语言函数:
ntuple_list linedetect(image_double image)
上述C语言函数中,linedetect为函数名,ntuple_list为输出,image为输入。C语言的源文件包含”.h”和”.c”文件。如:linedetect.h文件和linedetect.c文件。
编写mexfunction函数。mexfunction函数为C语言与MATLAB语言的接口函数。调用实例在mylinedetect.c文件中,文件内容如下:
#include “mex.h”
#include “matrix.h”
#include “linedetect.h”
#include “string.h”
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
int M;
int N;
double * pImg;
ntuple_list p;
struct image_double_s img_s;
if(nrhs==0)
{
mexPrintf(“error input\n”);
return;
}
M = mxGetM(prhs[0]);
N = mxGetN(prhs[0]);
pImg = mxGetPr(prhs[0]);
img_s.data = pImg;
img_s.xsize = M;
img_s.ysize = N;
p=lsd(img_s);
plhs[1] = mxCreateDoubleMatrix(1,3,mxREAL);
*(mxGetPr(plhs[1])+0) = p-size;
*(mxGetPr(plhs[1])+1) = p-max_size;
*(mxGetPr(plhs[1])+2) = p-dim;
plhs[0] = mxCreateDoubleMatrix(p-dim,p-max_size,mxREAL);
memcpy(mxGetPr(plhs[0]),p-values,(p-max_size)*(p-dim)*sizeof(double));
}
在MATLAB中调用mex指令编译相关文件,将C语言编译为MEX文件,如下所示。
mex mylinedetect.c linedetect.c
编译完成后,生成mylinedetect.mexw32或mylinedetect.mexw64文件,此文件即mex文件,用于MATLAB与C语言接口函数
编译完成之后,编写MATLAB函数,调用MEX文件。如下所示。
load trees;
%以MEX文件的形式调用编译完成的C语言函数
[o1,o2]=mylinedetect(double(X).’);
……
输出结果,上述linedetect函数完成图像中直线检测功能,带入MATLAB中调用后,形成如下结果。
C语言头文件函数声明的格式问题,matrix.h文件内容如下,报错,请大家帮忙找找我的格式哪里不对。。谢谢!
typedef那行后面应该有引号,而且Array放在后面
typedef后使用类型名Array不需要struct
然后是声明函数的时候是不能加花括号的,否则就是函数定义了
应该是:
Array add(Array arr1,Array arr);
这样
求c语言求矩阵的行列式和逆
这两个文件是专门用来做矩阵运算的
// Matrix.h: interface for matrix calculation functions.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_MATRIXCALCULATE_H__CCBC1D7D_4466_4E8B_87DD_0A98B462C18D__INCLUDED_)
#define AFX_MATRIXCALCULATE_H__CCBC1D7D_4466_4E8B_87DD_0A98B462C18D__INCLUDED_
#if _MSC_VER 1000
#pragma once
#endif // _MSC_VER 1000
////求矩阵matrix的行列式值,n为维数
float CalculateLiner(float *matrix,int n);
////求矩阵matrix的第i行,j列的代数余子式,n为维数
float CalculateCofacter(float *matrix,int i,int j,int n);
////matrixAT=(matrixA)T,m,n为matrixA的行、列数
void CalculateAT(float *matrixA,float *matrixAT,int m,int n);
////matrixAB=matrixA*matrixB,i,j为matrixA的行、列数,j,k为为matrixB的行、列数
void CalculateAB(float *matrixA,float *matrixB,float *matrixAB,int i,int j,int k);
////matrixATA=(matrixA)T*matrixA,m,n分别为matrixA的行、列数
void CalculateATA(float *matrixA,float *matrixATA,int m,int n);
////matrixA_为matrixA的逆,m为matrixA的行、列数
void CalculateA_(float *matrixA,float *matrixA_,int m);
///*矩阵求逆子程序(Good)*/
int Invers_matrix(float *m1,int n);
////求正定矩阵a的逆矩,n为阶数
int MatrixInversion(float *a, int n);
void MatInversion(float *a,int n);
////解矩阵方程matrixA*matrixX=matrixL,m,n分别为matrixA矩阵的行,列数
void EquationResolution(float *matrixA,float *matrixL,float *matrixX,int m,int n);
#endif // !defined(AFX_MATRIXCALCULATE_H__CCBC1D7D_4466_4E8B_87DD_0A98B462C18D__INCLUDED_)
// Matrix.cpp: implementation of the matrix calculation functions.
//
//////////////////////////////////////////////////////////////////////
#include “StdAfx.h”
#include “Matrix.h”
#include “math.h”
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
////求矩阵matrix的行列式值,n为维数
float CalculateLiner(float *matrix,int n)
{
float liner=0;
int i=0,j=0,k=0;
int p=0,q=0;
if(n==1)
return matrix[0];
else
{
float *tr=(float *)calloc((n-1)*(n-1),sizeof(float));
for(k=0;kn;k++)
{
p=0;
for(i=0;in;i++)
{
if(i!=0)
{
q=0;
for(j=0;jn;j++)
{
if(j!=k)
{
tr[p*(n-1)+q]=matrix[i*n+j];
q++;
}
}
p++;
}
}
liner+=matrix[k]*pow(-1,k)*CalculateLiner(tr,n-1);
}
free(tr);
return liner;
}
}
////求矩阵matrix的第i行,j列的代数余子式,n为维数
float CalculateCofacter(float *matrix,int i,int j,int n)
{
int x=0,y=0;
int p=0,q=0;
if(n==1)
return matrix[0];
else
{
float *tr=(float *)calloc((n-1)*(n-1),sizeof(float));
p=0;
for(x=0;xn;x++)
{
if(x!=i)
{
q=0;
for(y=0;yn;y++)
{
if(y!=j)
{
tr[p*(n-1)+q]=matrix[x*n+y];
q++;
}
}
p++;
}
}
float cc=pow(-1,i+j)*CalculateLiner(tr,n-1);
free(tr);
return cc;
}
}
////matrixAT=(matrixA)T,m,n为matrixA的行、列数
void CalculateAT(float *matrixA,float *matrixAT,int m,int n)
{
for (int i=0;im;i++)
{
for (int j=0;jn;j++)
{
matrixAT[j*m+i]=matrixA[i*n+j];
}
}
}
////matrixAB=matrixA*matrixB,i,j为matrixA的行、列数,j,k为为matrixB的行、列数
void CalculateAB(float *matrixA,float *matrixB,float *matrixAB,int i,int j,int k)
{
for (int m=0;mi;m++)
{
for (int n=0;nk;n++)
{
matrixAB[m*k+n]=0;
for (int s=0;sj;s++)
{
matrixAB[m*k+n]+=matrixA[m*j+s]*matrixB[s*k+n];
}
}
}
}
////matrixATA=(matrixA)T*matrixA,m,n为分别为matrixA的行、列数
void CalculateATA(float *matrixA,float *matrixATA,int m,int n)
{
float *at=(float *)calloc((m)*(n),sizeof(float));
CalculateAT(matrixA,at,m,n);
CalculateAB(at,matrixA,matrixATA,n,m,n);
free(at);
}
////matrixA_为matrixA的逆,m为matrixA的行、列数
void CalculateA_(float *matrixA,float *matrixA_,int m)
{
float liner=CalculateLiner(matrixA,m);
for(int i=0;im;i++)
{
for(int j=0;jm;j++)
matrixA_[j*m+i]=CalculateCofacter(matrixA,i,j,m)/liner;
}
}
////////////////////////////////////////////////////////////////////
////求正定矩阵a的逆矩,n为阶数
int MatrixInversion(float *a, int n)
{
int i, j, k, m;
float w, g, *b;
b = new float [n];
for(k = 0; k = n – 1; k++)
{
w = a[0];
w=a[0]+1.0e-15;
/*
if(fabs(w)+1.0 == 1.0)
{
delete b;
printf(“fail\n”);
return(-2);
}
*/
m = n – k – 1;
for(i = 1; i = n – 1; i++)
{
g = a[i * n];
b[i] = g / w;
if(i = m)
b[i] = -b[i];
for(j = 1; j = i; j++)
a[(i – 1) * n + j – 1] = a[i * n + j] + g * b[j];
}
a[n * n – 1] = 1.0 / w;
for(i = 1; i = n – 1; i++)
a[(n – 1) * n + i – 1] = b[i];
}
for(i = 0; i = n – 2; i++)
for(j = i + 1; j = n – 1; j++)
a[i * n + j] = a[j * n + i];
delete b;
return(2);
}
////求正定矩阵a的逆矩,n为阶数
void MatInversion(float *a,int n)
{
int i,j,k;
for(k=0;kn;k++)
{
for(i=0;in;i++)
{
if(i!=k) *(a+i*n+k) = -*(a+i*n+k)/(*(a+k*n+k));
}
*(a+k*n+k)=1/(*(a+k*n+k));
for(i=0;in;i++)
{
if(i!=k)
{
for(j=0;jn;j++)
{
if(j!=k) *(a+i*n+j) += *(a+k*n+j)* *(a+i*n+k);
}
}
}
for(j=0;jn;j++)
{
if(j!=k) *(a+k*n+j)*=*(a+k*n+k);
}
}
}
/*矩阵求逆子程序(Good)*/
int Invers_matrix(float *m1,int n)
{
int *is,*js;
int i,j,k,l,u,v;
float temp,max_v;
is=(int *)malloc(n*sizeof(int));
js=(int *)malloc(n*sizeof(int));
if(is==NULL||js==NULL)
{
printf(“out of memory!\n”);
return(0);
}
for(k=0;kn;k++)
{
max_v=0.0;
for(i=k;in;i++)
{
for(j=k;jn;j++)
{
temp=fabs(m1[i*n+j]);
if(tempmax_v)
{
max_v=temp; is[k]=i; js[k]=j;
}
}
}
if(max_v==0.0)
{
free(is); free(js);
printf(“invers is not availble!\n”);
return(0);
}
if(is[k]!=k)
{
for(j=0;jn;j++)
{
u=k*n+j; v=is[k]*n+j;
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
}
if(js[k]!=k)
for(i=0;in;i++)
{
u=i*n+k; v=i*n+js[k];
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
l=k*n+k;
m1[l]=1.0/m1[l];
for(j=0;jn;j++)
{
if(j!=k)
{
u=k*n+j;
m1[u]*=m1[l];
}
}
for(i=0;in;i++)
{
if(i!=k)
{
for(j=0;jn;j++)
{
if(j!=k)
{
u=i*n+j;
m1[u]-=m1[i*n+k]*m1[k*n+j];
}
}
}
}
for(i=0;in;i++)
{
if(i!=k)
{
u=i*n+k;
m1[u]*=-m1[l];
}
}
}
for(k=n-1;k=0;k–)
{
if(js[k]!=k)
for(j=0;jn;j++)
{
u=k*n+j; v=js[k]*n+j;
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
if(is[k]!=k)
for(i=0;in;i++)
{
u=i*n+k; v=i*n+is[k];
temp=m1[u]; m1[u]=m1[v]; m1[v]=temp;
}
}
free(is); free(js);
return(1);
}
void EquationResolution(float *matrixA,float *matrixL,float *matrixX,int m,int n)
{
if (mn) return;
float *at=(float *)malloc((m)*(n)*sizeof(float));
float *ata=(float *)malloc((n)*(n)*sizeof(float));
float *atl=(float *)malloc((n)*sizeof(float));
CalculateATA(matrixA,ata,m,n);
MatrixInversion(ata,n);
CalculateAT(matrixA,at,m,n);
CalculateAB(at,matrixL,atl,n,m,1);
CalculateAB(ata,atl,matrixX,n,n,1);
free(at);
free(ata);
free(atl);
}
c语言 任意输入一个3×3的矩阵,用函数实现求上三角矩阵并输出。
第一题#include stdio.h
void shangsan(int (*p)[3])
{
for(int i=0;i3;i++)
{
for(int j=0;j3;j++)
{
if(i==1j==0)
printf(“%c”,32);
else if(i==2(j==0||j==1))
printf(“%c”,32);
else
printf(“%d”,(*(p+i))[j]); }
printf(“\n”);
} }
void main()
{ int s[3][3];
for(int i=0;i3;i++)
for(int j=0;j3;j++)
scanf(“%d”,s[i][j]);
shangsan(s);}第二题#include stdio.h
int mystrcmp(char *p1,char *p2)
{ for(int i=0;i15;i++,p1++,p2++)
{ if(*p1!=*p2)
return *p1-*p2;
}
return 0;
}
void main()
{
int M;
char s1[15],s2[15];
gets(s1);
gets(s2);
M=mystrcmp(s1,s2);
if(M==0)
printf(“字符串相等!”);
else
printf(“字符串不相等!差值是:%d”,M); }第三题#include stdio.h
float HH(float score[])
{ float Max=0,Min=32767,sum=0;
for(int i=0;i10;i++)
{
sum+=score[i];
if(score[i]Max)
Max=score[i];
else if(Minscore[i])
Min=score[i];
}
score[0]=Max;
score[1]=Min;
return sum/10;}
void main()
{ float shuzu[10];
for(int i=0;i10;i++)
scanf(“%f”,shuzu[i]);
printf(“平均分是:%f\n最高分数是:%f\n最低分数是:%f\n”,HH(shuzu),shuzu[0],shuzu[1]);
}