013_NaN_in_Matlab中的非数与调试方法

Matlab中的非数与调试方法

是什么?

Matlab编程(计算器使用)中经常有个错误给你,这句话里可能包含一个关键词NaN。大部分学生都有过被 NaN 支配的痛苦记忆。

NaN 是 Not a Number 的缩写,表示不是一个数字。在 Matlab 中,NaN 是一个特殊的数值,表示一个无效的或未定义的数值。NaN 通常是由于计算错误或者无效的操作导致的。

我们可以通过以下方式创建一个 NaN

a = NaN;

这个 NaN 和Matlab中其他常量,如 truefalse 一样,居然是个函数,当我们直接不带括号的引用它时,按照前面的函数调用规则,它相当于就是NaN()

既然是个函数,我们就要看看它的函数签名,即它的输入参数和输出参数。我们可以通过以下方式查看:

help NaN
NaN    Not-a-Number.
    NaN is the IEEE arithmetic representation for Not-a-Number.
    A NaN is obtained as a result of mathematically undefined
    operations like 0.0/0.0  and inf-inf.

    NaN('double') is the same as NaN with no inputs.

    NaN('single') is the single precision representation of NaN.

    NaN(N) is an N-by-N matrix of NaNs.

    NaN(M,N) or NaN([M,N]) is an M-by-N matrix of NaNs.

    NaN(M,N,P,...) or NaN([M,N,P,...]) is an M-by-N-by-P-by-... array of NaNs.

    NaN(..., CLASSNAME) is an array of NaNs of class specified by the 
    string CLASSNAME. CLASSNAME can be either 'single' or 'double'.

    NaN(..., 'like', Y) is an array of NaNs with the same data type, sparsity,
    and complexity (real or complex) as the single or double precision numeric 
    variable Y.

    Note: The size inputs M, N, and P... should be nonnegative integers. 
    Negative integers are treated as 0.

    See also inf, isnan, isfinite, isfloat.

NaN    非数。
    NaN 是 IEEE 算术表示的非数。NaN可以通过数学上未定义的操作获得,例如 0.0/0.0 和 inf-inf。

    NaN('double') 和没有输入的 NaN 是一样的。

    NaN('single') 是 NaN 的单精度表示。

    NaN(N) 是一个 N×N 的 NaN 矩阵。

    NaN(M,N) 或 NaN([M,N]) 是一个 M×N 的 NaN 矩阵。

    NaN(M,N,P,...) 或 NaN([M,N,P,...]) 是一个 M×N×P×... 的 NaN 数组。

    NaN(..., CLASSNAME) 是一个由 CLASSNAME 指定的类的 NaN 数组。CLASSNAME 可以是 'single' 或 'double'。

    NaN(..., 'like', Y) 是一个与单精度或双精度数值变量 Y 相同数据类型、稀疏性和复杂性(实数或复数)的 NaN 数组。

    注意:大小输入 M、N 和 P... 应该是非负整数。负整数被视为 0。

    另见 inf, isnan, isfinite, isfloat.

什么样?

NaN 是一个特殊的数值,它的特点是:

  • 任何数值和 NaN 进行运算,结果都是 NaN
    • 向量中包含 NaN,那么这个向量的 sum 结果是 NaN
  • 每一个 NaN 都独一无二
    • 两个 NaN 之间进行比较,结果也是 false
    • NaN和任何东西~= 比较,结果都是 true
    • 任何数值和 NaN 进行大小(不等于除外)比较,结果都是 false
  • 可以通过函数 isnan (R2006a)或者 ismissing (R2013b)来判断一个数值是否是 NaN
  • 可以通过函数 anynan (R2022a) 或者 anymissing (R2022a) 来判断一个数组中是否包含 NaN
  • rmmissing (R2016a)可以用于检测和删除数组中的 NaN
  • fillmissing (R2016b)可以用于填充数组中的 NaN

上面这些函数,在不同的版本中引入,使用时要注意版本兼容性。具体的调用可以通过 help 函数查看,或者采用 doc 函数查看详细的文档。

怎么办?

在编程中,我们应该尽量避免产生 NaN。如果我们的程序中出现了 NaN,那么我们应该检查程序的逻辑,找出产生 NaN 的原因,进一步修复它们或者利用 NaN 作判断。

Matlab提供非常好的调试工具。大概我们调试Matlab程序有两种方式:

  1. 通过对怀疑的变量进行 isnan 判断,找出产生 NaN 的原因,以前我都是这么做的。
  2. 通过 dbstop if naninf 命令,可以在程序中出现 NaN 或者 Inf 时,自动停止程序,方便我们调试。

这个函数dbstop在R2016a之后就有了。当然,有了坦克和大炮,谁还会用长矛呢。

假设我们有个脚本或者函数,

a = zeros(1, 20);

b = a ./ a;

在命令行中,我们输入

dbstop if naninf

运行脚本,用编辑器的运行按钮,或者在命令行中输入函数或者脚本名称,Matlab的运行自然会停留在产生NaN的地方。

在这里插入图片描述

这个时候我们就可以逐一检查算式中的变量,找出产生NaN的原因。

结论

  1. NaN 是 Matlab 中的一个特殊数值,表示不是一个数字。
  2. NaN 有一些特殊的性质,我们可以通过函数来判断和处理。
  3. 文中提到的函数,有的是在较新的版本中引入的,使用时要注意版本兼容性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/545922.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apache Zeppelin 命令执行漏洞复现(CVE-2024-31861)

0x01 产品简介 Apache Zeppelin 是一个让交互式数据分析变得可行的基于网页的开源框架,Zeppelin提供了数据分析、数据可视化等功能, 0x02 漏洞概述 Apache Zeppelin 中代码生成控制不当(“代码注入”)漏洞。攻击者可以使用 She…

锁策略总结

锁策略 悲观锁和乐观锁 乐观锁和悲观锁不是具体类型的锁而是指两种不同的对待加锁的态度,这两个锁面对锁冲突的态度是相反的。 乐观锁:认为不存在很多的并发操作,因此不需要加锁。悲观锁:认为存在很多并发操作,因此需…

python实现简单的车道线检测

描述 python实现简单的车道线检测,本文章将介绍两种简单的方法 颜色阈值区域掩模canny边缘检测霍夫变换 这两种方法都能实现简单的车道线检测demo,注意仅仅是demo 下面的图片是用到的测试图片 方法1:颜色阈值(Color Selection…

jpa使用Querydsl需要规避的一些坑

在使用Spring Data JPA时,通常会使用Querydsl来构建类型安全的查询。在Querydsl中,为了区分实体类与Querydsl查询类,习惯上会给查询类的前缀添加一个"Q",表示该类是一个查询类。这样做可以有效地避免实体类与查询类之间…

并发学习28--多线程 Fork、Join线程池

概念 使用 import java.util.concurrent.ForkJoinPool; import java.util.concurrent.RecursiveTask;public class TC51 {public static void main(String[] args) {//递归到最小不可分解单元,再进行计算ForkJoinPool pool new ForkJoinPool(5);pool.invoke(new My…

「 典型安全漏洞系列 」14.NoSQL注入漏洞详解

NoSQL注入是一个漏洞,攻击者能够干扰应用程序对NoSQL数据库进行的查询,本文我们将研究如何测试一般的NoSQL漏洞,然后重点研究如何利用MongoDB中的漏洞(MongoDB是最流行的NoSQL数据库)。 1. 什么是NoSQL注入 NoSQL注入…

Langchain入门到实战-第二弹

Langchain入门到实战 Langchain快速入门官网地址Langchain概述Langchain调用大模型更新计划 Langchain快速入门 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://python.langchain.com/Langchain概述 LangChain是一个…

thinkphp 框架封装curl请求

tp6 或者 tp8框架 在框架的app/common.php 文件里加一些方法就可以 app\common.php 在这个文件里加 以下代码 就可以实现基于 curl的请求方法 (记得要开启 php的curl扩展) 查看方法 cmd里输入 php -m if (!function_exists(get)) {/*** 发送get请求* param string $url 请求…

【御控物联】 Java JSON结构转换(2):对象To对象——属性重组

文章目录 一、JSON结构转换是什么?二、案例之《JSON对象 To JSON对象》三、代码实现四、在线转换工具五、技术资料 一、JSON结构转换是什么? JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换,生成新的JS…

Stable Diffusion之文生图模型训练

1、数据准备 提前准备好一组相关的照片。 在线的图片处理网站 BIRME - Bulk Image Resizing Made Easy 2.0 (Online & Free) 将图片转成统一大小,支持批量处理,效率高 2、生成提示词 进入stable diffusion webui页面 旧版直接使用 train/proproc…

【服务器配置】ngnix环境配置

ngnix环境配置 概述 Nginx(发音为 “engine X”)是一个高性能的 HTTP 和反向代理服务器,也可用作邮件代理服务器。它以其稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。Nginx 被广泛用于提高网站的可扩展性和性能,因为它…

Android使用shape属性绘制边框内渐变色

目录 先上效果图实现方法shape属性介绍代码结果 先上效果图 这是使用AndroidStudio绘制的带有渐变色的边框背景色 实现方法 项目中由于UI设计需求,需要给按钮、控件设置带有背景色效果的。以下是UI效果图。 这里我们使用shape属性来绘制背景效果。 shape属性介…

JS-32-jQuery01-jQuery的引入

一、初识jQuery jQuery是JavaScript世界中使用最广泛的一个库。鉴于它如此流行,又如此好用,所以每一个入门JavaScript的前端工程师都应该了解和学习它。 jQuery是一个优秀的JS函数库。 (对BOM和DOM的封装) jQuery这么流行&#x…

IJKPLAYER源码分析-总体概述

1 前言 前面系列文章,对IJKPLAYER源码所涉及到的各个技术点、模块、关键技术及其实现原理,做了较为详细的梳理。但窃以为那只是微观层面的梳理,还不够完整不够透彻,本文拟尝试从宏观框架架构的视角加以补充。 算是抛砖引玉。 2 架…

idea运行Tomcat,控制台日志的中文乱码

一 版本 win10,idea2022,jdk18,tomcat9 二 问题描述 在idea上可以运行Tomcat。服务器启动后,可以正常访问本地的html文件。但是控制台的Tomcat日志出现了乱码:server与Tomcat Catlina Log两处。 三 无效的解决之道 1 idea的Help选项Edit …

设计模式-模板方法模式(TemplateMethod)

1. 概念 模板方法模式是一种行为设计模式,它在一个方法中定义算法的骨架,将一些步骤延迟到子类中实现。 2. 原理结构图 2.1 图 2.2 角色 抽象类(Abstract Class) 定义抽象的基本操作(Primitive Operations&#xff…

Redis单机版安装保姆级操作手册

Redis安装说明 大多数企业都是基于Linux服务器来部署项目,而且Redis官方也没有提供Windows版本的安装包。因此课程中我们会基于Linux系统来安装Redis. 此处选择的Linux版本为CentOS 7. Redis的官方网站地址:https://redis.io/ 单机安装Redis 1.安装…

深度探索:Secure Hash Algorithm(SHA)全景解析

title: 深度探索:Secure Hash Algorithm(SHA)全景解析 date: 2024/4/15 18:33:17 updated: 2024/4/15 18:33:17 tags: SHA安全抗碰撞性算法版本实现细节性能优化发展历史应用案例 密码学中的哈希函数 一、哈希函数的定义 哈希函数是一种数…

Day55 动态规划 part15

Day55 动态规划 part15 392.判断子序列 我的思路: 自己还是只能想到双指针法 解答: class Solution {public boolean isSubsequence(String s, String t) {if(s.length() 0) {return true;}if(s.length() > t.length() || t.length() 0) {return false;}ch…

微信小程序认证指南及注意事项

如何认证小程序? 一、操作步骤 登录小程序后台: https://mp.weixin.qq.com/ (点击前往) 找到设置,基本设置; 在【基本信息】处有备案和认证入口; 点击微信认证的【去认证】; 按照步骤指引一步步填写信息&#xff…