C++回炉之_C++PrimerPlus_第三章 处理数据

变量命名

  • 只能使用 字符字母 数字 下划线(_)
  • 第一个字符不能为数字
  • 不能将C++关键字作为名称
  • 区分大小写
  • 以两个下划线或下划线和大写字母打头的名称被保留给实现(编译器及其使用的资源)使用
  • 以一个下划线打头的名称被保留给实现,用作全局标识符
  • 对名称长度无限制, 但C99的限制是63个字符

整型

  • short 至少16位
  • int 至少和short一样长
  • long 至少32位, 且至少和int 一样长
  • long long 至少64位, 且至少和long一样长
  • 使用 < climits > 获得整形的限制信息
    • 最值
      • SHRT_MAX SHRT_MIN
      • INT_MAX INT_MIN
      • LONG_MAX LONG_MIN
      • LLONG_MAX LLONG_MIN
    • 字节数 – sizeof(int);
      • 对变量名使用sizeof时, 可不用括号 – sizeof a;
        字节位数 – CHAR_BIT
  • 无符号类型 – 使用unsigned关键字即可
    • unsigned int a = 10;
  • 选择
    • int 最自然 – 处理效率最高
    • short 节省内存 – 大型数组
    • long 可移植性高
    • char 只有一个字节时用
  • 整型的字面值
    • 十进制(decimal) – int a = 23; cout << dec << a << endl;
    • 八进制(hexadecimal) – int b = 046; cout << hex << b << endl;
    • 十六进制(octal) – int c = 0xAF; cout << oct << c << endl;
  • 整型后缀
    • L uL uLL 长整型 无符号长整型 无符号long long

char类型 – 字符和小整数

#include <iostream>
using namespace std;

int main() {
    char ch = 'M';
    int i = ch;
    cout << ch << " - " << i << endl;
    cout.put(ch); cout.put('!');        // 不带回车
    return 0;
}

输出结果

M - 77
M!

  • char 默认为 unsigned char[0,,255] 但也可显示声明为 signed char[-128, 127] – 单字节
  • 转义序列
    • 换行 \n
    • 回车 \r
    • 水平制表 \t
    • 垂直制表 \v
    • 退格 \b
    • 响铃 \a
    • 问号 \?
    • 反斜线 \
    • 单引号 \’
    • 双引号 \”
  • 通用字符名 – ISO 10646 和 Unicode
    • \u + 8个十六进制位 – \u006E
    • \U + 16个十六进制位
    • cout << “k\u00E2rper” << endl; – k芒rper
  • wchar_t 宽字符类型 – 双字节
    • wchar_t wch = L ‘P’ ; // 使用前缀L表示
    • wcout << L “hello” << endl; // 使用wcout和wcin代替cout和cin
  • char16_t 和 char32_t – C++11新增
    • char16_t ch1 = u’\u00F6’; // 无符号 16位
    • char32_t ch2 = U’\U0000222B’; // 无符号 32位

bool类型

bool flag = true; // 任何非零值
bool ok = false; // 零值

const限定符 – 定义常量

const type name = value;
const int maxn = 1004;
  • const相对于#define 的优点
    • 明确指定类型
    • 可限制在特定的作用域(函数或文件)内 – #define 为全局作用域
    • 可将const 用作更复杂的类型(数组或结构体)
    • 可用const 值声明数组长度

浮点数

  • 书写
    • 标准小数点表示法
      • 0.023
      • 8.0
    • E表示法
      • 3.45E8
      • 2.52e+5
      • 8.33E-4
      • 7E5
      • -18.34e24
  • 有效位

    • float 至少32位
    • double 至少48位 且不少于float
    • long double 至少和double一样
    • 指数范围到少是[-37, 37] – 可在 < cfloat > 头文件中查看

      
      #include <iostream>
      
      using namespace std;
      
      int main() {
          float a = 10.0 / 3.0;
          double b = 10.0 / 3.0;
          const float c = 1.0e6;
      
          cout.setf(ios_base::fixed, ios_base::floatfield);   // 使用定点表示法输出
          cout << "a = " << a << endl;
          cout << "b = " << b << endl;
      
          cout << "a*c = " << a*c << endl;                    // 精度不一样
          cout << "b*c = " << b*c << endl;
      
          cout << "a*c*10 = " << a*c*10 << endl;              //结果不正确
          return 0;
      }

      输出结果

      a = 3.333333
      b = 3.333333
      a*c = 3333333.250000
      b*c = 3333333.333333
      a*c*10 = 33333332.000000

  • 浮点后缀

    • float – f/F后缀 – 1.234f 1.234F
    • double – 默认类型 无后缀
    • long double – l/L后缀 – 1.234L

算术运算符

  • 基本运算符
    • + 加法
    • -\ 减法
    • * 乘法
    • / 除法 两个操作数都是整数时结果才为整数
    • % 求模 两个操作数必须是整数
  • 优先级
    • 先乘除(取模) 后加减
    • 可用括号控制优先级
    • 可在网上搜索C++运算符优先级表
  • 结合性
    • 两个优先级相同的运算符被同时用于一个操作数时,需要考虑是左结合还是右结合
    • 120/4*5 = 150 – 从左往右计算 左结合

类型转换

  • 自动类型转换
    • 大范围转小范围(long->int 或 float -> int等) 会丢失精度
    • 初始化时或将一种类型赋值给另一种类型时
    • 表达式中包含不同类型时 – 整形提升 小->大
    • 参数传递给函数时
    • 以{}初始化(列表初始化)时,不允许缩窄(float->int) (C++11)
  • 强制类型转换
    • (typename)value // C语言格式
    • typename(value) // C++格式 – 像函数调用一样
    • static_cast < typename > (value) – 更严格的转换(第十五章详解)

auto初探 – C十十11的福利

  • 自动推断类型
  • 使用STL时方便

    vector<int> x;
    vector<int>::iterator it = x.begin();

    可简化为

    vector<int> x;
    auto it = x.begin();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值