目录
  1. 1. Matlab编程总结
    1. 1.1. strcmp
    2. 1.2. double和single类型
    3. 1.3. Matlab正则表达式regexp
    4. 1.4. sub2ind
    5. 1.5. Matlab本地函数
    6. 1.6. 多行注释
    7. 1.7. 调试技巧
    8. 1.8. 创建一个空矩阵
    9. 1.9. 保存数据
    10. 1.10. waitbar使用
    11. 1.11. LibSVM安装
    12. 1.12. 概率密度拟合(连续-ksdensity)
Matlab编程技巧

Matlab编程总结

strcmp

字符串比较函数

% 字符串比较
s1 = 'Yes';
s2 = 'No';
s3 = 'No';
tf = strcmp(s1,s2) % 0
tf1 = strcmp(s2,s3) % 1
% cell数据结构也可以用
s1 = 'upon';
s2 = {'Once','upon';
'a','time'};
tf = strcmp(s1,s2)

注意事项:

  • strcmp 函数用于比较文本。如果用于不受支持的数据类型,strcmp 始终返回 0
  • 对于不区分大小写的文本比较,请使用strcmpi而不是 strcmp
  • 如果要比较每个字符,可以用关系运算符(==、~=、<、>、<=、>=)

doublesingle类型

数据类型从double类型转换成single类型可以节省一半的空间。默认情况下matlab用double存储数据。而double数据类型占8个字节,single类型占4个字节。

应用:在matlab中, 当数据比较大时,运算起来就困难了,有时候还会out of memory,就可以尝试将double类型改为single类型。

扩展:Matlab数据类型的转换

>> logical(-3.3)
ans =
logical
1
a = [1 2 3 ; 4 -1 -8 ; 0 0 0 ]
>> logical(a)
ans =
3×3 logical 数组
1 1 1
1 1 1
0 0 0
double(j) % j 可以是single也可以字符串,结果为ASCII
cell2mat() % 将cell转换为double格式

Matlab正则表达式regexp

clear;clc
str='ten,&8yn2tin6ui>&ton, t n,-356tpn,t#n,4@).,t@nT&nY';
pat='t.n';

[o11,o22,o33]=regexpi(str,pat,'start','end','match');%输出起始位置和子串
》o33 =
1×8 cell 数组
{'ten'} {'tin'} {'ton'} {'t n'} {'tpn'} {'t#n'} {'t@n'} {'T&n'}

str = 'bat cat can car COAT court cut ct CAT-scan';
expression = 'c[aeiou]+t';
startIndex = regexpi(str,expression)
参数 输出
start(默认) 匹配字符的起始索引
end 匹配字符的终止索引
tokenExtents 所有token的开始和终止的索引
match 匹配到的字符
names 每个token的名称和内容
split 非匹配到的子字符串的内容

sub2ind

3D索引指标转化为线性索引指标

% 创建一个指标索引
Kmodel = repmat(1:nTra_Speakers,nTra_Channels,1)';
Kmodel = Kmodel(:);
Ktest = repmat(1:nTra_Channels,nTra_Speakers,1);
Ktest = Ktest(:);
% 这个函数把3D索引指标转化为线性指标
linearInd =sub2ind([nTra_Speakers, nTra_Channels], Kmodel, Ktest);

Matlab本地函数

从版本R2016b开始,可以使用本地函数,如下所示:

data = 1:10;            %# A vector of data
squaredData = f(data); %# Invoke the local function

function y = f(x)
y = x.^2;
end

注意事项:

  • Matlab程序中所有的function函数应该放在文件的末尾
  • 无法在command中运行,必须F5

在发布R2016b之前,可以在MATLAB脚本中定义的唯一函数类型是匿名函数。例如:

data = 1:10;            %# A vector of data
f = @(x) x.^2; %# An anonymous function
squaredData = f(data); %# Invoke the anonymous function

多行注释

  1. ctrl+Rctrl+T

  2. 多行注释

    %{
    something something
    %}

调试技巧

在注释段前面加一行:if LOGICAL(0)

在注释段后面加一行:end

创建一个空矩阵

Matlab空矩阵没有长度

a = []

只能通过创建有长度的矩阵实现

a = ones(2,4)*nan
b = zeros(3,5)*nan

保存数据

fid = fopen('test4.txt', 'a'); 
fprintf(fid,'C值前%d维特征',i2);

.....主程序...................

fprintf(fid,'\n 识别率=%f%% \n',a/n*100)
fclose(fid);

waitbar使用

h = waitbar(0,'训练开始') % 初始化进度条
waitbar(x,h,'updated message'); % 可以根据进度动态调整显示内容
delete(wait_title); % 删除进度条
close(wait_title); % 关闭进度条

LibSVM安装

  • 文件下载:https://www.lanzous.com/i9r57be

  • Matlab安装MinGW-w64编译器

    MinGW-w64下载地址:http://tdm-gcc.tdragon.net/download

    注意:应下载64位的,而非32位。

    image-20200301171505396

  • 修改make.m文件

    将其中的CFLAGS改为COMPFLAGS

  • MATLAB命令行内运行命令setenv('MW_MINGW64_LOC','C:\TDM-GCC-64')

  • MATLAB命令行内运行命令 mex -setup C++

  • MATLAB命令行内运行命令 make

  • 添加文件到MATLAB路径

  • 测试:

    [heart_scale_label,heart_scale_inst] =libsvmread('heart_scale');

    model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');

    [predict_label, accuracy, dec_values] = svmpredict(heart_scale_label, heart_scale_inst, model);

概率密度拟合(连续-ksdensity

对于离散数据,可以直接用hist,统计频次。

对于连续数据,则必须使用概率密度函数。

调用格式:

  • [f,xi] = ksdensity(x)直接划分100分
  • f = ksdensity(x,xi)可以根据指定的标的,输出y

pdf与hist的比较:

Matlab代码:

y = randn(1,10000);
subplot 311; hist(y);xlim([-5,5]);grid on
[y2,xi] = ksdensity(y);
subplot 312; plot(xi,y2);grid on;xlim([-5,5])
xi2 = -5:0.01:5; % 可以自定义划分刻度的粗细
y3 = ksdensity(y,xi2);
subplot 313; plot(xi2,y3);grid on;xlim([-5,5])
set(gcf,'color','w');