MATLAB仿真中的小知识与小技巧
因为在日常MATLAB仿真中遇到了一些自己认为不高效的代码块,通过网上查找和阅读优秀代码,总结了一些MATLAB仿真中的小知识与小技巧。
- Cell:一个可以存储不同纬度矩阵的变量
- symerr和biterr函数用来计算误符号个数和误比特个数
- 学会定义结构体
- 删去无用的维度,去除重复的元素
- 百分比显示矩阵中元素的重复情况
- 删除向量中的某个数及该位置
Cell:一个可以存储不同纬度矩阵的变量
函数代码模块化,可以使一个代码仿真程序变得更易理解阅读,便于传播维护。但是调用函数就意味着参数的传入和传出,当参数量变大,名字变得繁琐的时候,就会影响代码编写的效率,并且容易出错。
一方面可以在主函数初始化时创建结构体以达到高效传输变量的目的(接下来会单独提到结构体),但对于代码编写中创建的暂用变量,使用结构体就有些不方便了。
这里有一个cell
变量可以很好得解决这个问题,它不但能够打包矩阵变量值,并且,每个矩阵的维度可以各不相同,真的很Nice啊!(但是有一点就是,cell
变量的每个维度存的什么东西需要自己“拿纸”记一下,因为它不帮你记……)下面举一个简单的例子:
clear all
A = cell(1,100);
for i=1:100
A{i}=[1:i];
end
symerr和biterr函数用来计算误符号个数和误比特个数
如果要对通信中链路级仿真的结果进行评估,误比特率基本上是少不了的。原来我的做法是,直接拿比特发送数据与接收端译码后的比特接收数据相减,再求模求总和才能得到误比特个数,看起来的确很不雅观。后来看到别人的代码,才发现原来还有直接求误比特个数的函数……
symerr(x,y)
用来计算两个维度相同的矩阵的误符号个数;
biterr(x,y)
用来计算两个维度相同的矩阵的误比特个数;
> x = [1 1; 1 1];
> y = [0 0; 1 1];
> symerr(x,y)
ans = 2
> biterr(x,y)
ans = 2
学会定义结构体
文章最开始有提到结构体,结构体可以说在大型程序里用得比较多。写着写着就会发现,结构体可以给编程带来极大的方便。
Statistics = struct(...
'NumOfErrorBits', zeros(1, Ns_max),...
'ratios', zeros(1, Ns_max),...
'BER_arr_Num', zeros(1, Ns_max));
删去无用的维度,去除重复的元素
- 删去无用的维度
squeeze()
因为矩阵变量定义时会定义多个维度,但是到最后可能会出现有一个维度只有1,所以删除无用维度可以使变量变得简练,并减少错误的出现。 - 去除重复的元素
unique()
百分比显示矩阵中元素的重复情况
tabulate()
函数可以统计计算结果中数值的个数,便于分析比对。
>> x = [2 2 6 5 2 3 2 4 3 4 3 4 4 4 4 2 2
6 0 4 7 2 5 8 3 1 3 2 5 3 6 2 3 5
4 3 1 4 2 2 2 3 1 5 2 6 3 4 1 2 5];
>> tabulate(x(:))
Value Count Percent
0 1 1.96%
1 4 7.84%
2 14 27.45%
3 10 19.61%
4 10 19.61%
5 6 11.76%
6 4 7.84%
7 1 1.96%
8 1 1.96%
删除向量中的某个数及该位置
删除向量中的某个数,这会改变向量长度哈
a=[1,3,8,7,13,14,17];
a(a==13)=[]
a =
1 3 8 7 14 17
目前基本上就是这些吧,一直会继续努力。欢迎大家互相交流哈。