MATLAB仿真过程中,编写MATLAB代码的时候犯了很多错误,做了很多蠢事。记录下自己犯错的点点滴滴,并引以为戒。使用MATLAB版本为2014a,以下内容如有不当还请指正。

1. 仿真开始前清理工作区

工作区存在的变量可能会对脚本运行产生影响,故代码(脚本)开头需要添加如下命令

clc;clear all;close all;

2. 养成良好的变量、函数命名习惯

MATLAB中有很多内置的常量、函数等。写代码的时候不能够随意命名,以防造成不必要的麻烦。譬如在循环时不应该使用i,j变量,在MATLAB中这多用于表示虚数符号。更多的内容可以参考《MATLAB 编程风格指南》。

3. 测试完成的代码再写出函数形式

有时候会把相对独立、固定的内容写成一个函数。但往往直接写成函数后是不利于测试的,即使添加断点后进入函数内部查看各变量取值,此时不能够观测到函数之外的变量。因此测试好代码无误再封装成函数是必要的。

4. 浮点数的精度

举个例子,下面代码运行结果是什么呢?

a=^-;b=;
if(a+b==)
fprintf('a+b=1');
else
fprintf('a+b!=1');
end

答案应该是输出 a+b=1,虽然很明显这是不成立的,但我们要知道MATLAB不是万能的,其表示的数的精度是有限的。对于精度问题不做具体的讨论,意识到这个问题后,我们必须将理论和时间区分开。

譬如在做除法的时候,有些变量依理论而言是不为0的,但实际上可能因为运算过程中的精度损失而使得计算结果产生Inf或是NaN,进而导致程序出现偏差。就拿上述例子来说,运行结果表明a+b-b=0。为避免这些情况的发生,必须对程序做相应的处理。在MATLAB中键入

help eps

This MATLAB function returns the distance from 1.0 to the next largest double-precision number, that is eps = 2^(-52).

可以在帮助文档内阅读详细描述,在实际代码中运用eps防止出现异常。(由其是在具有循环迭代的代码中更要注意这一点)

5. 写好注释,用好发布功能

我有个脚本试着发布了一下,如这里所示,实际上要好看些。这部分内容可以在帮助-MATLAB-Programming Scripts and Functions-Scripts中找到相关的介绍。个人觉得还是不错的,注释是肯定要写的,既然要写,为何不好好按照格式写呢?

当然,MATLAB提供的功能还是比较简单的,具体的功能大概也就这些。使用发布功能后代码会运行一遍,之后将结果也添加到发布的文档中去。

%%文档标题
% 具体描述
%
% 有格式文本
% 最后修改日期:--
% 软件版本:MATLAB(R) 2014a
%
% *加粗*
%
% # 编号列表
% # 编号列表 %%有标题节
% %%
%

6. 用好帮助,更要看清帮助

为什么很多仿真都用MATLAB?因为MATLAB很强大,很全面,可以做好很多事情。了解其强大功能的一个很好的途径是看其自身的帮助。当然,我想强调的是看清帮助。

前几天就犯了个错误,sgn是取符号的函数,MATLAB里面有个函数叫做sign实现了这个功能。然后我就用了,没有看清sign(0)=0……然而我希望的结果是sign(0)=1。所以在实际使用过程中还是要看清楚才行。

7. 适时保存运行结果

有的仿真要跑1天、两天、很多天,而且往往是可以中断的。为了防止电脑死机、断点,适时保存运行结果是必要的。我们可以让程序在命令行窗口实时输出信息以查看代码运行状态,并利用diary将这些信息保存起来。譬如

diary;
fprintf('\n-------------------------------\n');
fprintf('Eb/No = %e \n',Var1);
fprintf('总帧数 = %d, ',Var2);
fprintf('误帧数 = %d, ',Var3);

但我还是觉得新建文件自由一些,命令行窗口实时输出信息的格式还是不太好看。譬如我们可以将运行结果采用表格的形式存储起来,之后用readtable读取。

fid = fopen(FILE_NAME,'at+');
fprintf(fid,'日期 %s\n',datestr(now,'yyyymmdd'));
fprintf(fid,'EbN0\t T_Frame\t E_Frames\t E_Bits\t A_IterNums\t BER\t FER\n');
fprintf(fid,'%3.2g\t %5d\t %4d\t ',EbN0_dB(nEbN0),nF,frameError(nEbN0));
fprintf(fid,'%8d\t %8.6g\t ',bitError(nEbN0),iterNumTotal(nEbN0)/nF);
fprintf(fid,'%e\t %e\n',BER(nEbN0),frameError(nEbN0)/nF); readtable(FILE_NAME,'HeaderLines',,'Delimiter','\t')

读取的结果大概是这个样子,还是很好看的(虽然歪了……),而且可以轻松获取每列数据。

EbN0    T_Frame    E_Frames    E_Bits    A_IterNums    BER    FER
____ _______ ________ ______ __________ ___ ___

8.待续

……

MATLAB仿真总结的更多相关文章

  1. 经典功率谱估计及Matlab仿真

    原文出自:http://www.cnblogs.com/jacklu/p/5140913.html 功率谱估计在分析平稳各态遍历随机信号频率成分领域被广泛使用,并且已被成功应用到雷达信号处理.故障诊断 ...

  2. 极化码的matlab仿真(1)——参数设置

    根据老师的安排,对于极化码的了解从仿真开始. 仿真的手段有很多种.可以利用C,C++,matlab等进行仿真的实现.其中matlab由于具有强大的函数库,和壮观的矩阵运算能力,被(我们老师课题组)看中 ...

  3. (转) 经典功率谱估计及Matlab仿真

    原文出自:http://www.cnblogs.com/jacklu/p/5140913.html 功率谱估计在分析平稳各态遍历随机信号频率成分领域被广泛使用,并且已被成功应用到雷达信号处理.故障诊断 ...

  4. UVW平台运动控制算法以及matlab仿真

    UVW平台运动控制算法以及matlab仿真   最近公司同事因为对某视觉对位平台的运动控制算法有疑问,所以来请教我.由于我也是第一次接触到UVW自动对位平台(也可以叫XXY自动对位平台),于是找了一些 ...

  5. OFDM通信系统的MATLAB仿真(1)

    由于是第一篇博客,想先说点废话,其实自己早就想把学到的一些东西总结成文章随笔之类的供自己复习时查看的了.但是一是觉得自己学的的不够深入,总结也写不出什么很深刻的东西:二是觉得网上也有海量的资料了,需要 ...

  6. OFDM通信系统的MATLAB仿真(2)

    关于OFDM系统的MATLAB仿真实现的第二篇随笔,在第一篇中,我们讨论的是信号经过AWGN信道的情况,只用添加固定噪声功率的高斯白噪声就好了.但在实际无线信道中,信道干扰常常是加性噪声.多径衰落的结 ...

  7. Matlab 仿真实现TI Instaspin 的Foc 逆Clarke变换和SVPWM

    一直没搞明白TI 的Instaspin的SVPWM实现原理,最后只能在Matlab里仿真看看输出波形是不是和普通的SVPWM实现输出的波形一样,用M文件实现,下面是代码: clear all; the ...

  8. MATLAB仿真中连续和离散的控制器有何区别?

    matlab系统同时提供连续和离散的控制器和对象的目的是:在降低用户使用复杂程度的同时提高仿真精度.仿真速度和应用的广泛性. 仿真步长和求解精度的概念对于理解这个问题至关重要. 首先是步长,步长和求解 ...

  9. 极化码的matlab仿真(4)——SC译码(2)

    ================================================ 首先自作多情的说一句--"抱歉!" 古语"有志者.事竟成",是 ...

随机推荐

  1. Java解决题目:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子。。。

    题目:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子,假如兔子都不死,问M个月时兔子的数量,M为键盘读入的正整数.(请用Java语言作答) 样例输入: 3 样 ...

  2. redis 优化

    系统优化echo "vm.overcommit_memory=1" > /etc/sysctl.conf 0, 表示内核将检查是否有足够的可用内存供应用进程使用:如果有足够的 ...

  3. 17082 两个有序数序列中找第k小

    17082 两个有序数序列中找第k小 时间限制:1000MS  内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题   语言: 无限制 Description 已知两个已经排好序(非减 ...

  4. 【嵌入式开发板】8月终极暑促迅为Cortex-a9四核入门开发板

    核心板参数 尺寸 50mm*60mm 高度 连同连接器在内0.26cm CPU Exynos4412,四核Cortex-A9,主频为1.4GHz-1.6GHz 内存 1GB 双通道 DDR3(2GB  ...

  5. Virtual Box上安装CentOS7

    问题1:安装完没有桌面系统(Gnome或KDE)解答:安装的时候,软件选择为最小安装",更改该选择 问题2:开机提示Initial setup of CentOS Linux 7 (core ...

  6. UIView.frame的骗局

    如果你刚刚开始接触IOS编程, 刚刚接触UIKit, 肯定会被 frame, bounds, center, layer.anchorPoint, layer.position 这些乱七八糟得属性折腾 ...

  7. SpringBoot 快速入门

    本篇文章翻译来源为:http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/ 首先springboot ...

  8. 在Android Studio中使用shareSDK进行社会化分享(图文教程)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  9. Unity2D Sprite Packer用法介绍

    想充分利用图片空间? 我们用来做sprite的图片通常会留有很多空白的地方,我们在画完了sprite之后,这些地方很可能就没有什么作用了. 如果想避免这些资源上的浪费,我们可以把各个sprite做成图 ...

  10. c#中结构体(struct)和类(class)的区别

    一.类与结构的示例比较: 结构示例: public struct Person { string Name; int height; int weight public bool overWeight ...