C语言笔记--代码学习笔记--C语言语法--基本操作运算-basic-logorithm

2017-1-7

function1:

C语言如何实现一个复数加法,好像C语言里没有matlab的复数变量i,那么怎么办:

typedef struct _F_COMPLEX {
double real;
double img;
}F_COMPLEX;

然后在需要的地方调用:

void add(F_COMPLEX a,F_COMPLEX b,F_COMPLEX *c)

{
 c->real = a.real + b.real;
 c->img = a.img + b.img;
}

即可实现一个复数加法。->操作符适用于结构体指针。

function2:

经常看到需要求一些数学公式,能在math.h里找到的自然最好,找不到的就要自己查一下公式如何实现的。例如求反双曲余弦函数:

数学公式是这样的:


反双曲 余弦函数记作y=arcoshx。
双曲函数y=coshx的定义是y=coshx=
   
.那么,取它的反函数,最终得到反双曲余弦函数的定义是y=arcoshx=
   
参见百度:http://baike.baidu.com/view/6688537.htm

然后就可实现:

double arccosh(double x)//反双曲余弦,
{
return log(x+sqrt(pow(x,2)-1));
}

需要注意的是C语言里log是以e为底的。

function3:

复数的除法:这个好像是上大学那会线性代数还是复变函数里学的,基本上全忘完了,不说了,直接展代码:

void divi(F_COMPLEX a,F_COMPLEX b,F_COMPLEX *c)
{
 c->real=( a.real * b.real + a.img * b.img ) / ( b.real * b.real + b.img * b.img);
 c->img=( a.img * b.real - a.real * b.img) / (b.real * b.real + b.img * b.img);
}

function4:

一个在信号处理里比较常用的特征值,名曰峭度,数学上不过是归一化的4阶中心矩,没什么神奇的。

matlab 上有现成的函数:kurtosis函数,相应的skewness,歪度还是倾斜度

过程实现:

%  qd2=0;
%         for w=1:N
%             qd2=qd2+(x(w)-mean(x)).^4;
%         end
%             qd2=qd2/N;
%             qd2=qd2/(rms.^4);%qiaodu峭度是原信号的峭度

照着matlab验证完的去敲C代码是比较爽的:

double  find_Kurtosis(double a[],int n) //峭度值ok
{
int i;
double qd2=0;
double qd[N]={0};
//double qd2[N]={0};
double mean=find_mean(a,n);
for (i=0;i<n;i++)
{
qd[i]=a[i]-mean;//除均值
}
for (i=0;i<n;i++)
{
qd[i]=pow(qd[i],4);
}
return sum(qd,n)/n/(pow(find_rms(a,n),4));
}

function5:

找一个数组里的最大值。太简单了,就是把数组遍历一遍,然后依次比较如果当前值大于现在的最大值则替换当前的最大值,肯定有遍历一遍还要好的算法,这个找最大值太弱了;

double  find_max(double *a,int n) 
{
double max_value=a[0];
int i;
for (i=1;i<n;i++)
{
if(a[i] > max_value)
{
//printf("最大值=%f----i=%d---a[i]=%f\n",max_value,i,a[i]);
max_value=a[i];
}
}
return max_value;

}

function6:

找一个数组的平均值:所有点加和除以点数即可;

double  find_mean(double a[],int n) 
{
double sum_a=sum(a,n);
return sum_a/n;
}

function7:

找一个数组里的最小值,与找最大值得过程一样,不过这样算法的效率也是很低的:

double  find_min(double a[],int n) 
{
double min_value=a[0];
int i;
for (i=1;i<n;i++)
{
if(a[i]<min_value)
min_value=a[i];
}
return min_value;
}

function8:

找峰峰值,严格意义上来说,应该是最大值减去最小值:

double  find_Peak_to_Peak(double a[],int n) 
{
return find_max(a,n)-find_min(a,n);

}

function9:

double  find_rms(double a[],int n) 
{
int i;
double mean;
double b[N]={0};
mean=find_mean(a,n);
for (i=0;i<n;i++)
{
b[i]=a[i]-mean;
}
for (i=0;i<n;i++)
{
b[i]=pow(b[i],2);
}
return sqrt(sum(b,n)/n);
}

function10:

matlab里的翻转函数,

%FLIPLR Flip matrix in left/right direction.
%   FLIPLR(X) returns X with row preserved and columns flipped
%   in the left/right direction.
%   
%   X = 1 2 3     becomes  3 2 1
%          4 5 6                        6 5 4

matlab是比较强大的,不论你是数组还是矩阵,它都能翻转。

void fliplr(double *a,int len)//实现一维矩阵左右翻转,原始变量输入被修改
{
int i;
double temp;
if(len % 2 == 0){
for (i = 0; i < len / 2; i++) {
temp = a[i];
a[i] = a[len - i - 1];
a[len - i - 1] = temp;
}
}
else{
for( i = 0;i < (len-1) / 2;i++ ){
temp = a[i];
a[i] = a[len-i-1];
a[len-i-1] = temp;
}
}
}

function11:

C语言实现两个一维数组相乘;

void muiti_2_array(double *a,int length,double *b,double *c)
{
int i;
for (i=0;i<length;i++){
c[i]=a[i]*b[i];
}
}

function12:

//实现变量与数组相乘

void muiti_a_array(double a,int length,double *b,double *c)
{
int i;
for (i=0;i<length;i++){
c[i]=a*b[i];
}
}

function13:

复数的乘法,返回一个复数变量:

F_COMPLEX mul(F_COMPLEX a, F_COMPLEX b)
{
F_COMPLEX c;
c.real = a.real*b.real - a.img*b.img;
c.img = a.real*b.img + a.img*b.real;
return c;
}

function14:

void mul2(F_COMPLEX a,F_COMPLEX b,F_COMPLEX *c)
{
 c->real = a.real*b.real - a.img*b.img;
 c->img = a.real*b.img + a.img*b.real;
}

function15:

F_COMPLEX sub(F_COMPLEX a,F_COMPLEX b)
{
FFT_COMPLEX c;
c.real = a.real - b.real;
c.img = a.img -b.img;
return c;
}

function16:

地球人应该都能看懂:

double sum(double a[],int n)//ok
{
double sum=0.0;
int i;
for (i=0;i<n;i++)
{
sum=sum+a[i];
}
return sum;
}

function17

写出一个运算结果到文件中,无奈基础太差,只能先记下来了;

void write_file(double *pf)
{
int i = 0;
FILE *pfwrite = NULL;
fopen_s(&pfwrite,"test.txt", "w+");
for (i = 0; i < 16384; i++) {

fprintf(pfwrite, "%.20f\n", pf[i]);

}
fclose(pfwrite);
}

fopen_s与fopen的区别,说是一个能编译,一个不能。后面有空再研究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值