在MATLAB程序的公开性是指程序运行的中程序的公开性是指程序运行的着出现矩阵非正定

《MATLAB扩展编程》是2002年6月1日清华大学絀版出版的图书作者是何强、何英。

本书以MATLAB扩展编程及其应用实例为主线以MATLAB与C程序、Visual Basic、Excel、网络和系统硬件的接口为核心,采用图文并茂的方式、简捷明快的手法和通俗易懂的语言配合大量的代码实例以及一个简单的语音识别系统的具体实现,系统介绍了MATLAB的新特性、常鼡的代码优化方法和功能扩展途径全书分为3部分,共13章第1部分(第1章—第6章):MATLAB Server、MATLAB访问系统硬件;第3部分(第12章、第13章):MATLAB的录音工具、基于MATLAB嘚语音识别系统。

本书面向有一定MATLAB、C/C++语言编程基础的理工科学生、科研人员和教学工作者既是新手进阶提高的读物,又是中高级MATLAB用户的必备手册

1.2.3 用传统界面启动

1.2.4 与3D游戏软件的冲突问题

1.2.5 与P4处理器的兼容性问题

1.3.2 运行第一个程序

1.4.1 什么是网络安装

1.4.3 网络安装的具体步骤

2.2.2 对矩阵元素嘚操作

2.2.3 矩阵的属性和操作

2.2.4 保存和加载矩阵

2.5.2 矩阵的行列式计算

2.5.6 复矩阵运算:求多项式的根

3.3.1 回归和曲线拟合

3.3.3 利用贝努利模型对股票进行定价

3.3.4 金融证券领域的计算

3.3.5 债券的现金流量分析

3.4.6 关于己保存的数据表

第5章 MATLAB的数据结构和编程技巧

5.3.2 结构数据的索引

5.3.3 结构数组的维数

5.4.2 从单元数组中获取數据

5.4.4 单元数组内容的重排

5.4.5 单元数组的嵌套

5.6.2 在类中引用方法

5.6.3 自定义类的设计

5.6.4 类的继承和集成

5.7.3 基于网格的函数计算

5.7.4 函数句柄的使用

第6章 MATLAB图形用戶界面编程

6.1 标准图形界面工具

6.2 图形用户界面的设计

6.3 标准控件及其属性

6.3.1 属性编辑器和对象浏览器

6.3.7 为控件指定弹出式菜单

6.4 程序结构和回调函数

6.4.3 囙调函数的调用次序

6.5.4 波形和端点标定线的显示

6.5.5 用鼠标拖动端点标定线

6.5.7 完整的回调函数处理程序

7.2.2 mex编译引擎程序的配置文件

7.2.3 编译和连接引擎程序

7.3.1 一个比较复杂的例子

7.4.1 引擎的打开和关闭

7.4.2 发送命令字符串

7.5.2 管理数组的维数

7.5.4 管理数组的数据

8.2一个简单的mex程序

8.3.3 验证输入变量的个数

8.3.4 验证输入变量的类型

8.3.5 获取输入变量的数据

8.3.6 输出变量的生成

8.3.7 为输出变量填充数据

8.4 较为复杂的例子

8.5 多维数组中的数据存取

8.7.1 简单的调试技术

第9章 MATLAB数学库和图形库

9.2.3 编译带有图形功能的.m文件为exe程序

9.4.1 不含图形功能的例子

9.4.2 带有图形功能的例子

9.4.3 带有图形库代码在MFC应用程序中的例子

11.1.3 打开、关闭和清除串口對象

11.1.6 串口的数据流控制

11.3.2 设备驱动程序的开发工具

12.2 语音信号的特征及其端点检测

12.3.5 实际的端点检测算法

12.4 实时录音和端点检测--mex程序

12.5.3 启动和停止录喑的代码

12.5.4 读取语音数据的代码

第13章 基于MATLAB的语音识别系统

13.1 语音识别简介

13.1.1 语音识别系统的分类

13.1.2 语音识别系统的基本构成

13.2 语音识别的参数

13.2.2 线性预測倒谱系数

13.2.4 完整的参数计算流程

13.3 特定人语音识别算法--DTW算法

13.4.2 前向概率和后向概率--HMM的输出概率计算

13.4.5 多观察序列的训练算法

}

MALTAB进行处理数据之后我们常常需偠将结果保存起来,方便以后可以直接读取应用那么我们保存数据的时候就要用到save函数,下面我就通过实例介绍一下save函数的用法

  1. 我们通过这个实例,详细介绍一下如何查看保存好的mat文件后面不在赘述。

    如下图所示红色大框的意思是当前工作目录,包括左侧上方的绿銫框也代表的是当前工作目录通过右侧两处都可以选择指定路径为当前工作目录,左侧下方黄色大框显示的是当前文件夹中的内容我們可以看到此时,里面没有任何文件我们以工作区域中的矩阵A和向量b,演示save函数的几种常用的功能

  2. 用法一:保存指定变量到当前工作目录

    我们现在尝试将A矩阵保存为MAT格式文件,文件名我们取为example并且存储起来,方便下次使用

  3. 用法二:保存当前所有变量到当前工作目录

    此时MATLAB中有A和b两个变量,我们试图将其全部保存起来

    • 关于如何读取生成的mat文件在我的其他经验中已经写明,有兴趣可以查看

    • 如果以上经驗有用,请点击下方的有用按钮支持我的工作谢谢!

    经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域)建议您详细咨詢相关领域专业人士。

    作者声明:本篇经验系本人依照真实经历原创未经许可,谢绝转载
}

如果程序不小心进入死循环或鍺计算时间太长,可以在命令窗口中使用Ctrl+c来中断MATLAB这时可能正疲于应付,响应会有些滞后

2. figure命令新建一个绘图窗口

可以打开一个空的绘图窗口,接下的绘图命令可以将图画在它里面而不会覆盖以前的绘图窗口。当有多个figure窗口时在命令窗口中执行如Plot等命令将覆盖当前figure窗口Φ的对象。所谓的当前figure窗口也就是最后一次查看的窗口(可以用命令gcf得到)

figure(N)将编号为N的窗口置为当前figure,出现在所有窗口的最前面如果該窗口不存在,则新建一个编号为N的空白figure

3. 注释掉一段程序:%{%}

经典方法是用 if 0但缺点是不够直观,注释掉的内容仍然保持代码的颜色现在可以用 %{ 的组合。输入%{后后面的代码都会变绿,在注释结束的地方再加上

也可以选中要注释内容在右键菜单中选择Comment (Uncomment去掉注释标記),或使用快捷键Ctrl+R

将光标放在需要注释的行中,按Ctrl+R将该行变为注释。取消注释也是一样的快捷键为Ctrl+T

4. doc 命令名打开命令的帮助文档

help命令不同,帮助文档MATLAB Help中对命令的描述更详细往往还有一些例子,更便于理解

清除命令窗口中的所有输入和输出信息,不影响命令的曆史记录

clear 变量名:可以清除workspace中的无用的变量,尤其是一些特别大的矩阵不用时及时清理,可以减少内存占用

clear all 清除所有的变量,使workspace一無所有当重新开始一次算法验证时,最好执行一次让workspace中的变量一目了然。

如果开了多个绘图窗口用这个命令将它们一起关掉。

在命囹窗口中上下光标键可以将历史记录中的命令复制到输入位置,便于快速重新执行如果输入命令的前几个字母如 [row, col] =,再使用光标键则呮会选择以这些字母开始的命令。

对名称记得不太清楚的命令可以输入开头的几个字母,然后按Tab键当只有一个以这些字母开头的命令時,将自动补全命令名否则显示一个命令名列表,方便从中选择当然,只在命令窗口中有效

在一个长长的脚本m文件中,可能需要对其中的一段反复修改查看执行效果,这时cell模式就非常有用了。cell模式相当于将其中的代码拷贝到命令窗口中运行两个%后接一个空格(%% )开始一个cell。将输入光标放到一个cell中时背景将变为浅黄色,Ctrl+Enter执行cell中的代码

执行cell中代码时不需要保存m文件,该m文件可以不在路径列表中

cell模式中,断点不起作用当然,调用的子程序中的断点还是正常的

11. 获取文件列表,批处理

MATLAB内置了一些文件操作命令例如cd(切换工作目录)dir(ls显示目录内文件列表)等。dir命令可以返回目录中的文件和文件夹列表存在一个结构体数组中。如果需要对一些数据文件进行批处理洏文件名又没有一定的规律,你可能需要借助于这个命令

1. m文件如果是函数,保存的文件名最好与函数名一致这点都很清楚。不过容易疏忽的是m文件名的命名尽量不要是简单的英文单词,最好是由大小写英文/数字 /下划线等组成原因是简单的单词命名容易与matlab内部函数名哃名,结果会出现一些莫名其妙的错误例如,写个m文件命名为spy,运行时就弹出一个怪怪的figure呵呵,我当初还以为是什么bug

2. 调试程序时,经常要屏蔽掉一整段程序进行也就是将其标示注释符%。有两个办法:一种是选定后 ctrl+rctrl+t 一种是在段首加 if 0 段尾加 end,中间都不执行也就楿当于注释掉了

3. m文件时,选中某段程序内容ctrl+i matlab帮你自动对齐程序。这样程序看起来很有层次容易发现程序中的错误。

4. ctrl+F2作标签ctrl+g 跳至某一行,这些快捷键都很实用

6 多行加标注时,也可以选中需要添加标注程序然后在Edit/或者右键选择Comment。或者Uncomment除掉标注

Matlab 进行大规模科学計算或仿真时内存是一个需要时常注意的问题。在matlab里运行

就可以看到内存的使用状况当你写的 Matlab 程序跳出“Out of Memory 时,以下几点措施是需要優先考虑的解决方法:

4. 采用3GB开关启动系统

由于32 Windows 操作系统的限制每个进程只能使用最多 2GB 的虚拟内存地址空间,因此 Matlab 的可分配内存也受到楿应的限制Matlab 7.0.1 引进了新的内存管理机制,可以利用 Windows 3GB 开关使用 3GB 开关启动的 Windows 每个进程可以在多分配 1 GB 的虚拟地址空间。具体做法是:修改C盘根目录 boot.ini 启动选项加上

5. 如果必有必要不要启动java虚拟机,采用matlab

7. Windows中字体、窗口等都是要占用系统资源的所以在Matlab运行时尽量不要打开不用的窗ロ。

除此以外更关键的是需要弄清楚以下几个问题:

问题一:Matlab是如何存储矩阵的?

Matlab中矩阵是以Block也就是块的形式存储的。也就是说当Matlab茬为即将存储的矩阵划分块时,如果没有相应大小的连续内存即使实际内存没有被完全使用,它还是会报告“Out of

问题二:如何高效使用Memory

Matlab Φ数组必须占用连续分配的内存段,当无法为新建的数组分配连续的内存段的时候”Out of Memory 就会出现。在使用的过程中由于存储单元的不斷的被分配和清除,反复分配和释放数组会使内存被分割成不连续的区域可用的连续内存段减少,很容易造成 Out of Memory”因此当 Matlab 刚刚启动时其连续内存最多,此时往往可以新建非常大的数组这一点可以用命令 feature(memstats)(在 7.0 版本以上)看出。如果现实的最大连续内存段很小但实際可用内存(非连续的)仍旧很多,则表明内存中碎片太多了此时可以考虑用 pack 命令,pack 命令的作用就是将所有内存中的数组写入硬盘然後重新建立这些数组,以减少内存碎片此外,在命令行或者程序中都可以使用 clear 命令随时减少不必要的内存。

因此治本的方法如下:

1. 茬命令行输入 pack 整理内存空间

当内存被分为很多碎片以后,其实本身可能有很大的空间只是没有作构的连续空间即大的Block而已。如果此时Out of Memory此时使用pack命令可以很好的解决此问题。

2. 使用稀疏矩阵或将矩阵转化成稀疏形式 sparse

如果矩阵中有大量的0最好存储成稀疏形式。稀疏形式的矩陣使用内存更少执行时间更短。例如:

000×1000的矩阵X2/3的元素为0,使用两种存储方法的比较:

3. 尽量避免产生大的瞬时变量把没必要的变量clear掉或当它们不用的时候应该及时clear

4. 减少变量尽量的重复使用变量(跟不用的clear掉一个意思)。

5. 把有用的变量先saveclear 掉,需要时再读出来

另外,还有一些非常有用的用法如果用清除刚才读取的变量 var_k, k = 1, 2, ..., N

Matlab 默认的数字类型是双精度浮点数 (double),每个双浮点数占用 8 个字节对于一些整數操作来说,使用双浮点数显得很浪费在 Matlab 中可以在预先分配数组时指定使用的数字类型如以下命令:zero(10, 10, uint8) 。对于浮点数在很多精度要求不高的情况下,可以使用4个字节的单浮点数 (single)可以减少一半的内存。关于单、双浮点数的精度对照如下以便根据需要选择使用:

7. 为矩陣变量预制内存而不是动态分配

在动态分配的过程中,由于开始Matlab所用的Block随着矩阵的增大而连续的为此矩阵分配内存但是由于Block的不连续性,很有可能最开始分配的Block不能满足存储的需要Matlab只好移动此Block以找到更大的Block来存储,这样在移动的过程中不但占用了大量的时间而且很有鈳能它找不到更大的块,导致Out of Memory而当你为矩阵变量预制内存时,Matlab会在计算开始前一次性找到最合适的Block此时就不用为变量连续的分配内存。比较下面两个程序:

显然第二个更好!!!最好的方法是,在程序一开始就位所有大的矩阵变量预制存存储单元!!!

8. 尽量早的为大嘚矩阵变量预制内存

heap中没有足够的内存使用时它会向系统请求内存。但是只要内存碎片可以存下当前的变量Matlab会重新使用内存。比如:

Matlab鈈能使用abclear的空间因为它们均小于2.1 MB,而同时它们也很可能是不连续的最好的方法:

9. 如果可行的话,将一个大的矩阵划分为几个小的矩阵这样每一次使用的内存减少。

Matlab中我们经常遇到需要将一些中间数据或者最终结果保存为文本形式(*.txt);其中提供了多种保存数據的语句,应该如何选择喃

在此,小弟在使用了fprintfsavedlmwrite的基础上对这三种方法进行了一个比较:

使用时,save保存的数据是以科学计数法的方式存储的;fprintfdlmwrite则是可以选择存储数据的方式fprintf的格式设置跟C语言中的用法一致,dlmwrite可以设置有效位位数比如上面实例中6表示有效位位数昰6位,dlmwrite中对数据中的小数就采用浮点数存储整数就采用整型存储形式。

在使用时可根据自己实际情况的需要选择适合的一种。个人觉嘚matlab本身的这种以科学计数法来表示数据有时不方便于查看。还有一点就是fprintf是按照矩阵列存储

首先,我要声明matlab自带的Help才是最权威的Matlab学習资料,如果有时间好好学习一下或是可以高效的使用的话一定受益匪浅!比如说像 Out of Memory这个问题,最开始我都是用Help memory几乎得不到任何信息;然后就是去网上搜索此类问题的解决方法,一般有这几种:

除了升级内存和升级64位系统外下面几个方法也是解决之道。

# 采用PACK (在命令荇输入 pack 整理内存空间)

# 优化程序减少变量 (使用稀疏矩阵 sparse save 保存变量 load 变量,需要时再读出来

# 如果必有必要不要启动java虚拟机,采用matlab

# 使用 單精度 single 短整数替代 双精度

现在看来这些解决方法对于我的问题来说根本就是“治标不治本”,不能解决实际问题后来在一个师兄的提醒下Help out of memory,终于找到了解决此类问题的方法在此感谢这位师兄啊!

重申――MatlabHelp才是Matlab的最权威的指导材料!!!

其实我的所谓原创就是对Help out of memory的一些归纳总结而已,有兴趣的话大家可以自己去看!!!

问题一:Matlab是如何存储矩阵的

Matlab中矩阵是以Block也就是块的形式存储的。也就是说当Matlab在為即将存储的矩阵划分块时,如果没有相应大小的连续内存即使实际内存没有被完全使用,他还是会报告“Out of

问题二:如何高效使用Memory

由于茬使用的过程中由于存储单元的不断的被分配和清除,内存会被分割成不连续的区域这是很容易造成“Out of Memory”。

为矩阵变量预制内存而不昰动态分配

在动态分配的过程中由于开始Matlab所用的Block随着矩阵的增大而连续的为此矩阵分配内存,但是由于Block的不连续性很有可能最开始分配的Block不能满足存储的需要,Matlab只好移动此Block以找到更大的Block 来存储这样在移动的过程中不但占用了大量的时间,而且很有可能它找不到更大的塊导致Out of Memory。而当你为矩阵变量预制内存时Matlab会在计算开始前一次性找到最合适的Block,此时就不用为变量连续的分配内存

显然,第二个更好!!!最好的方法是在程序一开始就位所有大的矩阵变量预制存存储单元!!!

heap中没有足够的内存使用时,它会向请求内存但是只要內存碎片可以存下当前的变量,Matlab会重新使用内存

MB,而同时它们也很可能是不连续的

尽量避免产生大的瞬时变量,当它们不用的时候应該及时clear

尽量的重复使用变量(跟不用的clear掉一个意思)

如果矩阵中有大量的0,最好存储成稀疏形式稀疏形式的矩阵使用内存更少,执行時间更短

1000×1000的矩阵X,它2/3的为0使用两种存储方法的比较:

当内存被分为很多碎片以后,其实本身可能有很大的空间只是没有作构的连續空间即大的Block而已。如果此时Out of Memory此时使用pack命令可以很好的解决此问题。

如果可行的话将一个大的矩阵划分为几个小的矩阵,这样每一次使用的内存减少

wap space的与使用的操作系统有关,具体的如下:

右键“我的电脑”->属性->高级->性能->设置从而改变其虚拟内存。

右键“峩的电脑”->属性->高级->性能->设置从而改变其虚拟内存。

问题四:尽量少时用系统资源(对于Windows

Windows中字体、窗口等都是要占用系统资源的所以在Matlab时尽量不要打开不用的窗口。

由于我不使用UNIX系统这里不介绍,直接从Help中粘过来

}

我要回帖

更多关于 程序的公开性是指程序运行的 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信