数据类型
一 数据类型表示形式和计算方法
整型int
1.整型数说明
加上不同的修饰符, 整型数有以下几种类型;
signed short int 有符号短整型数说明。简写为short或int
signed long int 有符号长整型数说明。简写为long
unsigned short int 无符号短整型数说明。简写为unsigned int
unsigned long int 无符号长整型数说明。简写为unsigned long
2.整型变量定义略
3.整型常数
十进制以非0开始,8进制以0开始,10进制以0X开始
浮点型(float)
1.浮点数说明
浮点数均为有符号浮点数, 没有无符号浮点数。
2.浮点型变量定义
3.浮点常数表示
一浮点常数只有一种进制(十进制)。所有浮点常数都被默认为double。绝对值小于1的浮点数,小数点前面的零可省略。
字符型(char)
无值型(void)
基本运算:算术运算 逻辑运算 关系运算 按位运算 地址运算
二 类型转换
1.自由类型转换
发生在不同数据类型的量混合运算时,由编译系统自动完成。若参与运算的量的类型不同,则先转换成同一类型,然后进行运算。
注意:
1.转换由低到高。 精度排行short int<int<long int<long long
int<float<double<long double
2.所有的浮点运算都是以双精度进行的,即使仅含float。单精度量运算的表达式也要先转换成double型再做运算。
3.char型和stort型参与运算需要先转换成int型
4.在赋值运算中赋值号两边的量数据类型不同时,等号右边量的类型将转换为左边量的类型。
5. 不能对boolean类型进行类型转换。
6.不能把对象类型转换成不相关类的对象。
6. 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
7. 转换过程中可能导致溢出或损失精度
2. 强制类型转换
可以利用强制类型转换运算符,将一个运算式转换成所需类型。对于从高到低的强制转换,实质上就是一个截断的操作。只把低端需要的部分保留,其余的部分直接扔掉。
c++中类型转换大致有4种:
- dynamic_cast类型转换
(1) dynamic_cast是在运行时检查的,属于动态转换;
(2) 一般用于基类和派生类之间的相互转换。
- static_cast类型转换
(1) static_cast会在编译的过程中进行安全性检查,
相对与dynamic_cast是静态转换;
(2) 一般用于内置数据类型的转换和通常的类之间的转换。
- const_cast类型转换
主要是用于去掉指针和引用的const和volatile类型。
- reinterpret_cast类型转换
(1) reinterpret_cast是为了映射到一个完全不同类型的意思,这个关键词在我们需要把类型映射回原有类型时用到它。我们映射到的类型仅仅是为了故弄玄虚和其他目的,这是所有映射中最危险的。(这句话是C++编程思想中的原话)
(2) 用于完全没有关系指针或引用之间的转换,比如浮点型指针转整型指针;
(3) 相当于强制转换,不会考虑安全检查问题,这是需要值得注意的,不像dynamic_cast与static_cast进行安全检查。
三 数值溢出
1 无符号 unsigned型
若数据溢出,即超出有效值范围(2N-1),则最终得到的结果是对2N-1取余。
2有符号 signed型
C语言的定义是Undefined Overflow,也就是溢出的数正常显示,并不进行求余的运算。
四 移位
移位运算分为左移(<<)与右移(>>),其中右移又分为逻辑右移与算术右移。三者实现如下:
(1)左移:移出去的位丢弃,空缺位(vacant bit)用 0 填充;
(2)逻辑右移:移出去的位丢弃,空缺位(vacant bit)用 0 填充;
(3)算术右位:移出去的位丢弃,空缺位(vacant bit)用符号位来填充。
主成分分析
一 主成分分析(PCA)
主成分分析(Principal Component Analysis)是一种较为常用的降维技术,将多个变量转化成少数的几个综合变量,而综合变量能很好地表达原来多个变量的大部分信息,经过分析后的变量之间没有相关性。简单来说就是说在尽量保证数据本质的前提下将数据中的维数降低,从而能更加有效地利用大量统计数据进行定量分析,并可以更好地进行可视化、回归等后续处理。
二 基本原理及步骤
PCA的思想是将n维特征映射到k维上,这k维是全新的正交特征。这k维特征称为主元,是重新构造出来的k维特征。在PCA中,数据从原来的坐标系转换到新的坐标系下,新的坐标系的选择与数据本身是密切相关的。其中,第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴选取的是与第一个坐标轴正交且具有最大方差的方向,依次类推,我们可以取到这样的k个坐标轴。
基本操作流程:
1、去除平均值,让每一维特征减去各自特征的平均值
2、计算协方差矩阵,协方差的绝对值越大,对彼此的影响就越大。
3、计算协方差矩阵的特征值与特征向量
4、对特征值从大较小的排序
5、选择最大的K个特征值,对应的特征向量
6、将数据转换到K个特征向量构建的新空间中。
三 MATLAB实现
clear all;
X=[-1 -2;
-1 0;
1 1;
2 0;
-1 1];
%第一步:标准化矩阵
av=mean(X);
st=std(X);
X=(X-repmat(av,5,1))./repmat(st,5,1);
%第二步:计算相关系数矩阵
R=corrcoef(X);
%计算特征向量和特征值
[V,D]=eig(R);
V=(rot90(V))'; %将特征向量矩阵V从大到小排序
D=rot90(rot90(D)); %将特征值矩阵由大到小排序
E=diag(D); %将特征值矩阵转换为特征值向量
%计算贡献率和累计贡献率
r=0;
for k=1:2
r=E(k)/sum(E);
r=r+r;
if(r>=0.9) %取累计贡献率大于等于90%的主成分
break;
end
end
Y=X*V;
标准化矩阵
特征向量矩阵