C的学习笔记

1,int,long int 分配的都是4个字节;float,4 ;double,8;long double,16个字节。

      像3.1415926默认是double型数据;

2,! > 算术运算符(+,-,*,/) > 关系运算符(<,>,<=,>=,==,!=) > &&和|| > 赋值运算符(=)。

3,用到true时,需引入stdbool.h头文件。

#include <stdio.h>
#include <stdbool.h>
int main(){	
	_Bool a;
	a = 10>=0;
	if(a == true)
	printf("%d",a);   
}

4,数组名代表数组的首元素的地址。

char c[] = {"china"};
	
printf("%s",c);
5,函数的声明的作用,是把函数的名字,类型,形参的类型,个数,顺序,告知编译系统,以便在函数调用时,系统按此进行对照检查。

6,指针与数组

	int a = 11;
	int *p;
	
	p = &a;//把a的地址 赋值给p 
	printf("%d\n%d\n",a,p);

	int n[] = {1,2,3};
	printf("%d\n%d\n%d\n%d\n",&n[0],n,*n,*&n[0]);
7,指针变量作实参,必须使指针变量有确定值。

8,选择排序算法。

	void sort(int x[], int n){
		int i,j,k,t;
		for(i = 0; i< n-1; i++){
			k = i;
			for(j = i+1; j < n; j++){
				if(x[j] > x[k]){//由大到小排序 
					k = j;
				}
			}
			if(k != i){
				t = x[i];
				x[i] = x[k];
				x[k] = t;
			}
		}
	}

9,指向由m个元素组成的一维数组的指针变量

实例1:

	int m[4][3] = {{11,22,33},{332,444,55},{66,77,88},{00,99,88}};
	int (*s)[2];
	s = m;
	printf("%d\n%d\n",*(*(s+1)+1),(*s)[2]); //444 , 33

	int m[4][3] = {{11,22,33},{332,44,55},{66,77,88},{00,99,88}};
	int (*s)[2];
	s = m;
	printf("%d\n%d\n",*(*(s+1)+1),(*s)[2]);//332,33

                [Warning] assignment from incompatible pointer type

10,字符串与指针

	char a[] = "Ilikeyou!";
	char *str ;
	str = a;
	printf("%c\n%c\n%c\n%c\n",str[3],a[3],*(a+3),*(str+3));

11,指针与函数

  用指向函数的指针,作为参数,传递到其他函数中

int (*p)(int , int)

12,一些定义;

	int *P;//指针变量 
	int (*p)[4];//行指针 
	int (*p)(int, int){};//指向函数的指针 
	int *p(){};//返回指针指的函数 
	int *p[4];//指针数组 
	int **p;//多重指针 
	void *p;//p 是一个指针变量,基类型为void(空类型),不指向具体的对象

13,一些研究例子;

	char *s[] = {"111","sdmn"};
	char *c ;
	char str[] = "klkl";
	c = str;
	printf("%s\n%c\n%c\n%c\n",s[1],*(str+1),*(s[1]+2),*s[1]);
	char **p;
	p = s + 1;
	printf("%d\n%d\n%s\n",s[0],*p,*p);

14,int *(*(*p)[10])(void);  //   t = (*p)[10]  k = *t

	enum Week{
		sun,mon,sta
	}a;
	enum Week b;
	a = mon;
	b= sta;
	printf("%d",b);

	union Data{
		int i;
		char ch;
		float f;
	}a,b;
	union Data c;
	
	
	a.i = 97;
	a.ch = 8;
	a.f = 90;
	
	c.i = 89;
	
	printf("%f",a.f);


struct Stu{
	int num;
	char name[20];
}a={10101,"lilin"};


struct Stu b = {10102,"lloyd"};
struct Stu c = {.name = "chou",.num = 10103};

printf("%d\n%s", c.num,c.name);


15,文件

	FILE *p;
	p = fopen("file.dat","w");
	char ch;
	ch = getchar();
	while(ch != '#'){
		fputc(ch,p);
		putchar(ch);
		ch = getchar();
	}	
	//fputc('q',p);
	fclose(p);
	//putchar(10);


16,带参数的宏

#include <stdio.h>
#include <stdlib.h>
#define SQ(y) ((y)*(y))
int main(int argc, char *argv[]) {

	int i = 1;
	while(i<=5){
		printf("%d\n",SQ(i++));
	}
		
}

	/*int SQ(int y){
		return ((y)*(y));
	}*/








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值