NaN是什么,怎么处理 --matlab

NaN (Not a Number)

NaN (不是一个数),当你处理不同,多种多样的数据时,会经常碰到NaN ,NaN 是0/0 或者是导入了一个字符串作为数值。也可能是无穷或者是当你插入了一个超出给定范围的数。接下来我们看下NaN 有啥性质,以及如何处理

A_var = [-8 10 NaN 9 4 -4 -7; 9 NaN 9 4 -10 9 0; -8 10 NaN 5 -10 -1 NaN] 
A_var =
-8 10 NaN 9 4 -4 -7
 9 NaN 9 4 -10 9 0
-8 10 NaN 5 -10 -1 NaN

先创造一个含NaN 的数组

>> sum(A_var)%sum()是一个可以算出每列和的函数
ans = -7 NaN NaN 18 -16 4 NaN

可以看出有NaN 的列和全为NaN

怎么把这NaN除去,第一个你自己手工找出索引
>> A_var([7 9 21])=[0, 0, 0] % All at once or % A_var([7 9 21])=0
> A_var =
-8 10 0 9 4 -4 -7 
9 0 9 4 -10 9 0
-8 10 0 5 -10 -1 0

然后你再试下sum()
或这

nansum()含NaN求和

试下

nansum(A_Var)

这里还有一堆关于NaN的函数,尝试自己去试下

nanmax(), nanmean(), nanmedian(), nanmin(), nanstd(), and nanvar()

找到NaN的位置
Index2=ismissing(A_var) %Identifies all missing elements hidden behind NaN
>> A_var(Index2) ans = NaN NaN NaN NaN
>> A_var(Index2)=0 
>A_var =
-8 10 0 9 4 -4 -7 
9 0 9 4 -10 9 0
-8 10 0 5 -10 -1 0

或者用find()函数

B_var = randi([0, 25], 7);
IndexB = find(B_var>3 & B_var<9)


用类似的find方法去找index就行

### 处理MATLABNaN值的方法 #### 使用插值法替换缺失值 对于希望采用插值方式填补据集中存在的`NaN`值的情况,在MATLAB中有专门用于此目的的功能函。通过调用`fillmissing`命令并指定内插方法参,能够实现对组或表格内的空缺位置进行合理的值填充[^1]。 ```matlab % 创建含有NaN据向量作为例子 data = [2 4 NaN 8 10]; % 利用线性插值来替代所有的NaN项 filledDataLinear = fillmissing(data,'linear'); disp('原始据:'); disp(data); disp('经过线性插值得到的结果:'); disp(filledDataLinear); ``` #### 将NaN转换为特定(如零) 另一种常见的做法就是简单地把所有遇到的`NaN`直接设置成某个固定常比如0。这可以通过组合使用`isnan()`判断条件以及索引操作轻松完成[^2]。 ```matlab % 定义含有一些NaN元素的一维组 arrayWithNans = [NaN 2 4 5 NaN 2 4 5 ]; % 把其中每一个NaN都变为0 arrayWithZerosInsteadOfNans = arrayWithNans; arrayWithZerosInsteadOfNans(isnan(arrayWithZerosInsteadOfNans))=0; disp('原组:'); disp(arrayWithNans); disp('修改后的组:'); disp(arrayWithZerosInsteadOfNans); ``` #### 移除包含NaN的整行/列 当面对多维度结构化据集时,有时最简便有效的策略可能是彻底移除那些存在任何不确定性的记录条目。借助于逻辑运算符与矩阵切片技术可以在不改变其余部分的前提下达成这一目标[^4]。 ```matlab % 构建一个具有随机分布NaN值的小型二维表单 matrixWithRandomNans = rand([3,4]); p=randperm(numel(matrixWithRandomNans), round(0.2*numel(matrixWithRandomNans))); matrixWithRandomNans(p) = NaN; % 展示初始状态下的表格形式 disp('带有随机生成NaN值前的状态'); disp(matrixWithRandomNans); % 清除掉任一单元格里有NaN所在的那一整个横排 cleanedMatrixWithoutRowsHavingAnyNan = matrixWithRandomNans(~any(isnan(matrixWithRandomNans),2), : ); disp('清除后剩余的有效行列'); disp(cleanedMatrixWithoutRowsHavingAnyNan); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值