MATCOM函数.docx
《MATCOM函数.docx》由会员分享,可在线阅读,更多相关《MATCOM函数.docx(35页珍藏版)》请在冰豆网上搜索。
MATCOM函数
MATCOM函数
1.一个win32应用程序框架
#include
voidmain()
{
initM(MATCOM_VERSION);
...........
...........
exitM();
}
2.求矩阵行列式和逆
新建矩阵文件:
m.txt
1 -4 3
3 5 8
2 4 1
代码:
Mmx;
load(TM("m.txt"),CL(x));
printf("矩阵:
\n");
disp(x);
printf("行列式:
\n");
disp(det(x));
printf("逆矩阵:
\n");
Mmy=inv(x);
disp(y);
结果:
3.傅立叶变换FFT
什么是FFT?
3.1输出到屏幕
代码:
printf("FFT例子--visualsan@\n");
Mmx;
doubledata[]={1,3,4,5,2,3,6};
M_VECTOR(x,data);
printf("inputdata:
\n");
disp(x);
printf("afterFFT:
\n");
disp(fft(x));
结果:
3.2提取实部虚部并存储
printf("FFT例子--visualsan@\n");
Mmx;
doubledata[]={1,3,4,5,2,3,6};
M_VECTOR(x,data);
printf("inputdata:
\n");
disp(x);
printf("afterFFT:
\n");
Mm y=fft(x);
double*realpart;//存储实部
double*imagepart;//存储虚部
realpart =newdouble[y.size()];
imagepart=newdouble[y.size()];
for(inti=0;i {
realpart[i]=y.r(i+1);
imagepart[i]=y.i(i+1);
}
FILE(*f);
f=fopen("result.txt","w");
fprintf(f,"visualsan@\n傅立叶变换结果\n");
fprintf(f,"实部\t虚部\n");
for(i=0;i {
fprintf(f,"%.4g\t%.4g\n",realpart[i],imagepart[i]);
}
fclose(f);
deleterealpart;
deleteimagepart;
结果:
4.解线性方程组
我们假设有方程组如下:
0.21x + y+ z =2
x -1.29y+2.11z =0.919
-0.11x + y =0;
尽量写的丑一些,我想肯定没人想解它。
4.1手动输入参数
代码:
printf("线性方程组例子--visualsan@\n");
Mmx,y;
doublea[]={
0.21 , 1 ,1 ,
1 ,-1.29 ,2.11,
-0.11, 1 ,0 };//系数
doubleb[]={ 2 , 0.919,0 };
M_VECTOR(x,a);
x.reshape(3,3);
x=transpose(x);
M_VECTOR(y,b);
y.reshape(3,1);
printf("方程为:
\n");
disp(x);
disp(y);
printf("解:
\n");
disp(mldivide(x,y));
结果:
4.2来自文件,写入文件
新建矩阵文件:
a.txt
0.21 1 1
1 -1.29 2.11
-0.11 1 0
新建矩阵文件:
b.txt
2
0.919
0
代码:
printf("线性方程组例子--visualsan@\n");
Mmx,y,r;
load(TM("a.txt"),CL(x));
load(TM("b.txt"),CL(y));
disp(x);
disp(y);
r=mldivide(x,y);
saveascii(TM("result.txt"),CL(r));
结果:
result.txt
-18.04811372335
-1.985292509568
7.775396391471
1.and
逻辑运算符,z=and(x,y);返回x&y的逻辑运算。
当x和y都为1时,结果为1,否则为0;这个函数只允许输入两个参数,可以是数值或者是向量。
在c++中的调用形式是mand(x,y);
例子:
Mmx,y,z;
doublex_v[]={1,0,1,1,0};
x=zeros(1,5);
memcpy(x.addr(),x_v,5*sizeof(double));
disp(TM("x=\n"));
disp(x);
doubley_v[]={0,1,0,1,1};
disp(TM("y=\n"));
y=zeros(1,5);
memcpy(y.addr(),y_v,5*sizeof(double));
disp(y);
z=mand(x,y);
disp(TM("x&y=\n"));
disp(z);
2.colon
y=colon(i,j,k)可以产生一组数组,以i为起点,j为间距,k为终点。
例子
Mmx,y,z;
x=colon(1,0.1,10);
y=sin(x);
plot((CL(x),y,TM("*")));
结果:
3.ctranspose
这是一个产生共轭复数额函数,y=ctranspose(x)的结果是产生x的共轭复数。
在matcom中复数的虚部位i.
(复数详细介绍)
例子:
disp(TM("visualsan@---小老虎2010.1.2"));
disp(TM("matcom函数
(1)\n"));
Mmx,y;
x=4*rand
(2)+4*rand
(2)*i;
disp(TM("复数矩阵x:
"));
disp(x);
y=ctranspose(x);
disp(TM("共轭矩阵x:
"));
disp(y);
结果:
4.eq
这是一个比较函数,用于比较两个数是否相等。
如果相等,返回1,不等返回0;
数既可以为单个数,也可以是矩阵。
如果是矩阵,返回结果为相应的矩阵。
两个
矩阵只有维数相等才能比较。
y=[123;
456];
x=[103;
050];
x,y比较结果为:
[101;
010];
例子:
disp(TM("visualsan@---小老虎2010.1.2"));
disp(TM("matcom函数
(1)\n"));
Mmx,y,z;
doublex_v[]={1,10,1,1,0.1,2.1};
x=zeros(1,6);
memcpy(x.addr(),x_v,6*sizeof(double));
x.reshape(2,3);
disp(TM("x="));
disp(x);
doubley_v[]={1,10,0,1,1.0,2.1};
disp(TM("y="));
y=zeros(1,6);
memcpy(y.addr(),y_v,6*sizeof(double));
y.reshape(2,3);
disp(y);
z=eq(x,y);
disp(TM("eq(x,y)="));
disp(z);
结果:
5.ge
和eq用法一样,它是大于等于运算符。
z=ge(y,x)的结果是:
1.当x和y为单个数时,x>=y时返回1;x 2.当x和y为矩阵时,矩阵的每个元素进行比较,返回一个矩阵
当x矩阵的相应位置元素大于等于y的相应位置元素时返回1,否则为0;
6.gt
和ge用法一样,它是大于运算符。
7.ldivide
左除运算。
z=ldivide(x,y)的结果是y的每个位置上的元素除于x相应位置后的结果,即x.\y
例子:
disp(TM("visualsan@---小老虎2010.1.2"));
disp(TM("matcom函数
(1)\n"));
Mmx,y,z;
x=rand(4);
y=zeros(4);
for(inti=1;i<=4;i++)
{
for(intj=1;j<=4;j++)
{
y.r(i,j)=i+j*2+1;
}
}
z=ldivide(x,y);
disp(TM("x="));
disp(x);
disp(TM("y="));
disp(y);
disp(TM("x.\y="));
disp(z);
结果:
8.le
和ge用法一样,它是小于等于运算符。
9.lt
和ge用法一样,它是小于运算符。
10.minus
这是一个减法运算符,y=minus(x,y)的结果是返回x-y的结果。
对于矩阵,要求行列数相等。
x可以为矩阵,而y可以为数值,此时的运算结果是x的每个元素减去y的大小。
例子:
disp(TM("visualsan@---小老虎2010.1.2"));
disp(TM("matcom函数
(1)\n"));
Mmx,y,z;
x=rand
(2);
z=minus(x,1);
disp(TM("X="));
disp(x);
disp(TM("minus(x,1)="));
disp(z);
y=rand
(2);
z=minus(x,y);
disp(TM("y="));
disp(y);
disp(TM("minus(x,y)="));
disp(z);
11.mldivide
这是一个经常用到的函数,对于线性方程xz=y,解z=x\y.此时可调用z=lmdivide(x,y),它返回x\y的结果。
当x,y同为矩阵时,x,y的行数必须相同。
结果z的行数和x相同,列数和y相同。
例子:
disp(TM("visualsan@---小老虎2010.1.2"));
disp(TM("matcom函数
(1)\n"));
printf("线性方程组");
Mmx,y;
doublea[]={
2 , 1 ,1,
1 ,-1 ,2,
-1, 1 ,1 };//系数
doubleb[]={ 2 , 2,1 };
M_VECTOR(x,a);
x.reshape(3,3);
x=transpose(x);
M_VECTOR(y,b);
y.reshape(3,1);
printf("方程为:
\n");
disp(x);
disp(y);
printf("解:
\n");
disp(mldivide(x,y));
结果:
12.not
取反运算符。
在c++环境中名称为mnot;
例子:
disp(TM("visualsan@---小老虎2010.1.2"));
disp(TM("matcom函数
(1)\n"));
Mmx,y,z;
x=rand(4);
y=rand(4);
z=gt(x,y);
disp(TM("Z="));
disp(z);
disp(TM("not(Z)="));
disp(mnot(z));
结果:
12。
or
或运算。
在c++环境中名称为mor.用法和and一样。
13.mpower
这是一个指数运算符。
z=mpower(x,y)的结果有几种情况,取决于参数:
1.当x为矩阵,y为数值时,返回x的y次方即x^y,结束时一个矩阵。
2.当y为矩阵,x为数值时,返回另外一种结果。
3.当x和y同时为矩阵时,将发生错误。
例子:
disp(TM("visualsan@---小老虎2010.1.2"));
disp(TM("matcom函数
(1)\n"));
Mmx,y,z;
x=rand(4);
y=x*2;
z=mpower(y,2);
disp(TM("y="));
disp(y);
disp(TM("mpower(y,2)="));
disp(z);
结果:
1.mabs
计算绝对值。
y=a+b*i;
z=mabs(y);z的值为sqrt(a*a+b*b).其中y为矩阵或者数值。
例子:
Mmx;
x=-magic
(2)+10*rand
(2)*i;
disp(TM("x="));
disp(x);
disp(TM("mabs(x)="));
disp(mabs(x));
结果:
2.angle
计算复数的幅角。
y=a+b*i;
angle(y)=atan(b/a);
例子:
Mmx;
x=magic
(2)+2*rand
(2)*i;
disp(TM("x="));
disp(x);
disp(TM("angle(x)="));
disp(angle(x)*180.0/pi);
结果:
3.ceil
这是一个对矩阵所有元素向上取整运算。
对于正数,x=1.23,ceil(x)=2;
对于负数,x=-1.23,ceil(x)=-1;
例子:
Mmx;
disp(TM("visualsan@"));
x=2*rand(4);
disp(TM("正数:
ceil(x)="));
disp(x);
disp(TM("ceil(x)="));
disp(ceil(x));
x=-2*rand(4);
disp(TM("负数:
ceil(x)="));
disp(x);
disp(TM("ceil(x)="));
disp(ceil(x));
结果:
plex
构造复数。
y=complex(a,b);构造复数y=a+b*i。
在c++环境中函数名为mcomplex.
例子:
Mmx,a,b;
disp(TM("visualsan@"));
a=rand
(2);
b=rand
(2);
x=mcomplex(a,b);
display(a);
display(b);
display(x);
结果:
puter
返回当前程序所运行的系统平台。
例子:
Mmx,a,b;
disp(TM("visualsan@"));
x=computer();
x.setstr
(1);
disp(x);
结果:
6.conj
构造共轭负数。
y=a+b*i;
conj(y)为a-b*i.
例子:
Mmx,a,b;
disp(TM("visualsan@"));
a=rand
(2);
b=rand
(2);
x=mcomplex(a,b);
display(x);
display(conj(x));
结果:
7.cross
计算向量的叉积。
z=cross(x,y).返回z为x和y的叉积。
x=(x1,x2,x3);
y=(y1,y2,y3);
z=cross(x,y);
z=(x2*y3-x3*y2,x3*y1-y3*x1,x1*y2-x2*y1);
例子:
Mma,b;
disp(TM("visualsan@"));
a=ceil(rand(1,3)*3);
b=ceil(rand(1,3)*2);
display(a);
display(b);
display(cross(a,b));
结果:
8.cumsum
计算向量或矩阵的前N项和。
若=[x1,x2,x3,x4....],则cumsum(x)=[x1,x1+x2,x1+x2+x3,x1+x2+x3+x4....];
若x=[x1;
x2;
x3;
x4
..
],
则cumsum(x)=[x1;
x1+x2;
x1+x2+x3;
x1+x2+x3+x4
....];
若x=[x11,x12,x13,x14;
x21,x22,x23,x24;
x31,x32,x33,x34;
x41,x42,x43,x44;
],
则cumsum(x)=[x11,x12,x13,x14;
x11+x21,x12+x22,x13+x23,x14+x24;
x11+x21+x31,x12+x22+x32,x13+x23+x33,x14+x24+x34;
x11+x21+x31+x41,x12+x22+x32+x42,x13+x23+x33+x43,x14+x24+x34+x44
];
例子:
Mma,b;
disp(TM("visualsan@"));
b=ceil(rand(4,1)*3);
display(b);
display(cumsum(b));
b=ceil(rand(1,4)*3);
display(b);
display(cumsum(b));
b=ceil(rand(4)*3);
display(b);
display(cumsum(b));
结果:
9.dot
计算点积:
x=(x1,x2,x3);
y=(y1,y2,y3);
dot(x,y)=[x1*y1,x2*y2,x3*y3];
例子:
Mma,b;
disp(TM("visualsan@"));
a=ceil(rand(1,4)*3);
b=ceil(rand(1,4)*3);
display(a);
display(dot(a,b));
结果:
10.double
将矩阵转换为双精度。
在c++里名称为mdouble;
y=mdouble(x);
11.exp
计算自然对数。
例子:
Mma;
disp(TM("visualsan@"));
a=ceil(rand(1,4)*3);
display(a);
display(exp(a));
结果:
12.eye
y=eye(m,n)
这个函数可以产生一个mXn矩阵,它的所有元素为零,
只有对角线的元素为1.
例子:
Mma,b;
disp(TM("visualsan@"));
a=eye(3,4);
display(a);
结果:
13.fix
对一个矩阵的所有元素取整。
y=[1.2,2.3];fix(y)=[1,2];
y=[-1.2,-2.3];fix(y)=[-1,-2];
例子:
Mma,b;
disp(TM("visualsan@"));
a=-rand(3,1)*3;
display(a);
b=fix(a);
display(b);
a=rand(3,1)*3;
display(a);
b=fix(a);
display(b);
结果:
1.floor
y=floor(x)将返回一个整数y使得:
x-1例子:
disp(TM("visualsan@---小老虎2010.1.5"));
disp(TM("matcom函数(4)\n"));
Mmx,y;
x=10*rand(3);
disp(TM("x="));
disp(x);
y=floor(x);
disp(TM("floor(x)="));
disp(y);
结果:
2.horzcat
这个函数的功能是将两个矩阵横向合并成一个矩阵,
z=horzcat(x,y)的结果是z=[xy];
例子:
disp(TM("visualsan@---小老虎2010.1.5"));
disp(TM("matcom函数(4)\n"));
Mmx,y,z;
x=ceil(10*rand(3));
disp(TM("x="));
disp(x);
y=ceil(10*rand(3));
disp(TM("y="