0%

MATLAB编程指北

常用技巧

  1. 折叠
    • ctrl = 折叠代码
    • shift ctrl =展开代码
  2. 缩进整理 ctrl i(==全选+ctrl i==)
  3. 跳转到第几行 ctrl g
  4. F5运行,F10 debug,shift+F5 退出Debug模式
  5. doc 取代help,直接跳出文档(由于外网,网络可能不稳定)

提醒

  • 注意,MATLAB所有序号都是==从1开始==
  • MATLAB中 ==Class Array== 的思想随处不在
    • 例如对于a = 54,使用whos命令可以看到,MATLAB认为这是一个Size 1×1 8 Bytes的double array,==而非一个简单的double变量==。
    • 再例如,str1 ="string",是一个Size 1×1的,150 Bytes的Class为String的Array变量。也就是说,你完全可以直接str1(2) = “string2”,这种操作被理解为在str1这个string array变量中增加了一个元素。
    • 同样的,char = 'char'是定义了一个Size 1×4的,Bytes为8的 Class 为 char的Array变量。
  • 使用%% %来区分不同Block的代码是一种好方法

数据类型

  • double
  • single(单精度)
  • logical
  • int8(1B 8bit)
  • int16
  • int32
  • int64
  • uint8
  • char(‘’)
  • string(“”)
  • NaN(Not a Number)
  • Inf(无穷):有正负之分
  • cell
  • struct
  • function_handle

常用

矩阵操作

  • flipud(M): 翻转矩阵,从下面往上反转
  • fliplr:左右翻转
  • flip([]): 翻转向量,矩阵的话和ud一样
  • repmat(A, 2, 3):横向重复两次,纵向3次
  • repelem(A, 2, 3):repeat element 原来矩阵每个元素都2×3,重新组成新的
  • max(A):每列中最大的元素
  • diff(): 每次相邻两个元素之间做差
  • prod() :返回数组乘积
  • cumsum():返回前n个元素的和
    • cumprod()
    • cummin()
    • cummax()
  • linspace(x1,x2,n) :产生n个x1到x2的数据,间隔(x2-x1)/(n-1)
    • logspace(x1,x2,n): 产生n个$$10^{x1}$$到x2的数据

增删改查

  • find(logical_vector, k, 'first') :首k个true值
  • any(logical_vector)
  • all(logical_vector)

绘图

  • 线颜色

    • b : blue
    • g : green
    • r : red
    • c : cyan 青蓝色
    • m : magenta 品红色
    • y : yellow
    • k :black
    • w :white
  • 线样式

    • -- 段虚线
    • : 点虚线
    • -. 段点虚线
    • marker
      • *-. *为marker
      • o
      • .
      • x
      • s square 方块
      • d 菱形
      • v
      • ^
      • <
      • >
      • p 五角形
      • h 六角形
  • close all 关闭所有的figure

  • clf 清空当前画布 clear current figure

    • 还有cla,清空坐标区
  • subplot(row, col, n_th)

  • grid on 网格

  • legend() 图例

  • xlabel('') ylabel('') title('')

    • 如果要LaTeX显示,需要在后面的'Interpreter'设置为'latex'
      • 例如
        1
        title(['Predictive signal $\hat{d}(n)$ and orignal signal $d(n)$ with p=',num2str(p)],'Interpreter','latex');
  • plot修饰

    • color+marker+line_shape, e.g. 'ro-.'
    • LineWidth 默认为1
    • MarkerEdgeColor Marker边缘的颜色
    • MakerFaceColor Marker里面的颜色
  • axis([x1 x2 y1 y2]) 设置坐标轴范围

字符和字符串

  • strlength("string"): 字符串长度
  • string 类型可以通过{}的方式提取出char类型结果,例如可以通过string{1}(2)提取出第一个string中的第二个char
  • input('Some suggestion string:','s') 输入的是char类型
  • Upper,全部大写
  • strcmp(str1, str2, num),前num位的字符是否相同
  • strfind(text, pattern) 找text中pattern 的位置
  • strsplit(text, pattern) split 字符串

元胞数组

  • {48, "uui", 1:4:9}
  • 访问使用{index} {1,2}

结构体

  • S = struct('field1',VALUES1,'field2',VALUES2,...)

保存加载

  • save testfile.dat mydata -ascii save 文件名 变量名
  • load file_name.dat

可变长输入输出

  • varargin{1}: variable argument input, cell 类型,存储输入参数
  • nargin 输入参数个数
  • varargout 输出参数
  • nargout 输出个数

本地函数和嵌套函数

  • 本地函数,单个m文件中定义的函数,作用域为整个m文件
  • 嵌套函数(可以使用所有外层函数定义的量)

函数句柄

  • function_handle,为一个单独的数据类型
  • 使用 func_han = @(argm1, argm2) argm1*argm2; 即可定义手柄
  • func2str(func_hndl);得到函数名字
  • 相关函数
    • fplot(@sin(), [0, 2*pi])
    • feval(@sin(), 0:0.1:1) 返回每个值对应的函数输出
    • timeit(func_handle),算函数计算的时间

      通信相关

qammod

1
2
ModDataTX = qammod(BinData, MOD, 'InputType', 'bit', 'PlotConstellation',true);
% 对于输入bit 流进行 QAM调制,MOD是调制阶数,InputType指定输入类型

注意 matlab中 vector’ 如果是vector复数向量,就算的直接是共轭转置,这个被坑过,如果想只转置可以用 vector.’

berfading

估计fading时的性能,参数是SNR,调制方式,调制模,复用参数

1
2
3
4
5
6
7
8
9
10
11
12
13
EbNo = 8:2:20; % Eb/N0
ber = zeros(length(EbNo),20);
for L = 1:20
ber(:,L) = berfading(EbNo,'qam',16,L); % 16 QAM
end

semilogy(EbNo,ber,'b')
text(18.5, 0.02, sprintf('L=%d',1))
text(18.5, 1e-11, sprintf('L=%d',20))
title('QAM over fading channel with diversity order 1 to 20')
xlabel('E_b/N_0 (dB)')
ylabel('BER')
grid on

image

随机数

rng('shuffle')来使用当前时间作为随机数种子

rand

0-1 随机数

randi

伪随机整数

X = randi([imin,imax],size_1,size_2)

X = randi(imax,sz1,…,szN)

1
2
3
randi([min max], row_number, col_number);
% e.g.
randi([0 10], 1000, 1); % Generate 1000✖1 random vector with range from 0 to 10

randn

randn生成正态分布随机数

X = randn(n) 返回由正态分布的随机数组成的 n×n 矩阵。

X = randn(sz1,…,szN) 返回由随机数组成的 sz1×…×szN 数组,其中 sz1,…,szN 指示每个维度的大小。例如:randn(3,4) 返回一个 3×4 的矩阵。

X = randn(sz) 返回由随机数组成的数组,其中大小向量 sz 定义 size(X)。例如:randn([3 4]) 返回一个 3×4 的矩阵。