学习matlab使用过程中遇到的各种常见小操作,放在这里权当记录,持续更新中。包括批量导入数据、读取/写入不同类型的文件、与或非、cell、randperm的使用等

一、常见函数或小技巧

1. 记录程序运行时间:

函数tic、toc。 tic放在要记录时间的程序的开头,toc放在末尾

2. 常见函数

1) mean用法:

默认是对每一列求平均值,mean(x,2)是对每一行求平均值。很多函数都是同理,size(x,1)就是求矩阵x的行数,size(x,2)就是求列数在一个数据文件中,提取矩阵第一列是 x(:,1),提取第一行x(1,:)sum(x,1) 将矩阵按列求和,sum(x,2) 按行求和

2) ceil:朝正无穷大四舍五入 

    round(x) :将 x 的每个元素四舍五入为最近的整数。

>> ceil(2.5)

ans =

     3

3) flipud:实现矩阵的上下翻转

如果 A 是一个列向量,则 flipud(A) 返回一个相同长度的向量,其元素的顺序颠倒。如果 A 是一个行向量,则 flipud(A) 只返回 A。

>> A=(1:3)'
>> B = flipud(A)
B =
     3
     2
     1

fliplr            沿垂轴翻转矩阵 

transpose          沿主对角线翻转矩阵

4)  horcat 和vercat 

horcat(A,B)           % 水平串联数组,即X=[A,B],等同于cat(1,A,B)
vercat(A,B)           % 垂直聚合数组, 即X=[A;B],等同于cat(2,A,B)

5) qr   矩阵正交分解 

6) snapnow 拍摄最近生成的图像或绘图的快照,以包括在发布文件中。快照显示在包含 snapnow 命令的代码节的末尾。

7) bsxfun: 两个数组间元素逐个计算.
 

C=bsxfun(fun,A,B)  %fun是函数句柄或者m文件,也可以为如下内置函数 :

@plus 加          @minus 减          @times 数组乘          @rdivide 左除         @ldivide 右除 

3. struct

 使用XX= getfield(文件名, '结构体中字段名'),获取数据。

4.cell的使用

保存cell:

例子:

save('c6001.mat','dta');  % 将dta以.mat格式 命名为c6001.mat并保存到当前目录
save('dta');              % 将dta以.mat格式保存到当前目录,文件名为dta.mat

读取cell:

1.X= C(s)使用这种"()“形式的返回的是cell类
2.X = C{s}使用这种”{}"形式的返回的是cell中的内容

要取Cell(命名为C)的第X列元素,可用cell2mat(C(:,X))直接读为矩阵

举例:

>> A=[1,2,3,4];
B=[5];
C=[6,7];
p={A,B,C};
>> p{1}(1,2)

ans =

     2

5.与& 或| 非~  与 运算关系符

1)A&B
(i)首先判断A的逻辑值,然后判断B的值,然后进行逻辑与的计算。
(ii)A和B可以为矩阵(e.g. A=[1 0],B=[0 0])。
2)A&&B
(i)首先判断A的逻辑值,如果A的值为假,就可以判断整个表达式的值为假,就不需要再判断B的值。
(ii)A和B不能是矩阵,只能是标量。

3)~:not

~(A) 返回与 A 大小相同的逻辑数组。如果 A 中元素为零值,则数组中对应元素为逻辑值 1 (true) 值;如果 A 中元素为非零值,则数组中对应元素为逻辑值 0 (false)。

运算关系符:>(大于)、 >=(大于或等于)、 ==(等于)、~=(不等于)

6. 命令窗口(Command Window)中常用快捷键或命令:

(用【】表示键盘上的快捷键)

1.【上、下键】――切换到之前、之后的命令,可以重复按多次来达到你想要的命令
2. clc――清除命令窗口显示的语句,此命令并不清空当前工作区的变量,仅仅是把屏幕上显示出来的语句清除掉
3. clear――清空当前工作区的变量命令,常用语句clear all来完成

4. close ―― 删除指定图窗,  常用close all来完成,另外,close all hidden 删除包括句柄隐藏的参数(更强有力的删除)

5.【Tab】键――:在command窗口,输入一个命令的前几个字符,然后按tab键,会弹出前面含这几个字符的所有命令,找到你要的命令,回车,就可以自动完成。

示例:


6.【Ctrl+C】(或【Ctrl+Break】)――在matlab程序运行过程中,可能由于程序编写的失误,导致程序不停的运行,在命令窗口输入“Ctrl+C”可以将运行的程序停下来,而不需要将整个Matlab程序关掉。不过进行此操作的前提是能够激活切换到命令窗口才行。

7. format

format compact  %隐藏过多的空白行以便在一个屏幕上显示更多输出。事实上,不少人直接会把2.3.4.7这几个放在代码的开头

format long  %将输出格式设置为长固定十进制小数点格式并显示 pi 的值

close all;clear;clc
format compact

7. 在编辑器(Editor)中常用快捷键或命令:

1. 【Tab】(或【Ctrl+]】)――增加缩进(对多行有效)(可以进行输入补全操作

    【Tab+Shift】――减少缩进(就是减少前面的空格,同样对多行有效

示例:


2.【Ctrl+[】--减少缩进(就是快捷删掉matlab代码前空格)(对多行有效)
3. 【Ctrl+I】--自动缩进(即自动排版,对多行有效)
4.【Ctrl+R】――注释(对多行有效)(选中需要注释%的行后按Ctrl+R)
5.【Ctrl+T】――去掉注释(对多行有效)
6.【F12】――设置或取消断点
7.【F5】――运行脚本中所有代码

8.【F9】——(Evaluate Selection)运行选中代码

9. 长串的注释

%{
注释内容。。。
。。。
%}                    

10.【Ctrl+F】-- 查找替换

有时想要把写好的参数换个名字,手动选择非常费劲,查找替换简洁方便

选中要查找的名字-【Ctrl+F】-输入要替换的名字

二、常见程序代码

1. 在MATLAB中读取同一路径下文件,批量导入数据:

D = dir('E:\matlab\SVM_CSDN\test_c1\c1\*.csv');
for i = 1 : length(D)
load(['E:\matlab\SVM_CSDN\test_c1\c1\' D(i).name]);
end

或者:

file=dir('E:\matlab\SVM_CSDN\test_c1\c1\*.csv');
for n=1:length(file) 
    temp=dlmread(['E:\matlab\SVM_CSDN\test_c1\c1\',file(n).name],' ',1,0);
    eval([file(n).name(1:end-4),'=temp;'])
end 


2.读取不同类型的文件

(1)读取mat文件:

load('文件名')      % 等效于 load 文件名
load('位置\文件名')

如:

load features
load('features.mat')
load('features.mat', 'featotal')  % 有多个mat文件只导入其中一个

注:若使用load提取的数据类型是结构体struct

如果只想要提取一个mat文件可以用下面代码

% 用 struct2cell 将 struct 转换为 cell 类型,再用 cell2mat 转换为数组类型
raw_data  =cell2mat(struct2cell(load('data.mat')));   

或者:

raw_data  =struct2array(load('data.mat'))); 

(2)读取xlsx 文件:xlsread('路径\数据名')

    例如:train=xlsread('E:\matlab\datasets\PHM 2010\test_c1\分类数据.xlsx');

(3)读取csv 文件:

1) A = csvread('filename')

     filename:文件名,将数据读到矩阵A中。如: c1=csvread('E:\matlab\datasets\PHM 2010\c1\c_1_008.csv'); 

2) A = csvread('filename', row, col)

    开始读取位置的行号(row)和列号(col)。这里,行号、列号以0开始计数。也就是说,row=0, col=0表示从文件中第一个数开始读。

3) A = csvread('filename', row, col, range) 

    range限定了读取的范围。range = [R1 C1 R2 C2],这里(R1,C1)是读取区域的左上角,(R2,C2)是读取区域的右下角。在使用这种方法时,要求row, col等于range中的前两项。

注:csv是最通用的一种文件格式,它可以非常容易地被导入各种PC表格及数据库中,csv文件用记事本和excel都能打开。csvread函数只适用于用逗号分隔的纯数字文件,即要求csv文件中只能包含数字。另外,csv文件中的空项,读到矩阵中时,会初始化为0.

(4) 读取txt文件:

A = importdata('filename')            % 此函数只导入数据
data = A.data; %读取非元胞的数据

也可以用load 

:当导入.txt文本时,中文出现乱码时,在前面添加以下代码即可解决。

feature('DefaultCharacterSet', 'UTF8'); % 使得matlab支持utf-8编码

3. 写入不同类型的文件

(1)写入xlsx 文件:xlswrite('Excel路径+Excel的名称','需要输出的矩阵名称','工作表名称')

例子:

test = [1 2 3;4 5 6;7 8 9;10 11 12];
xlswrite('test.xlsx',test,'Sheet2')

(2)写入mat文件:save('路径\文件名','待保存的文件')

例如:

save A;    %将当前工作区中的所有变量以MAT文件保存到A中。如果A已存在,save 会覆盖该文件。
save('A.mat');      % 与 save A 或 save A.mat 等效
save('file1.mat','A'); %将变量A保存到当前文件夹中的文件
save('E:\matlab\file1.mat','A'); %将变量A保存到指定文件夹中的文件
load E:\matlab\test\c_6\c6_wear.csv;
save wear.mat;     %注意这里.csv变成了.mat

上面可以发现load完数据后可以使用save改变文件的后缀格式

注意:切记不能写为save(name, a),因为matlab的save函数是通过字符串去寻找工作区里的变量。所以一定要在变量上面加上 ' '。 

4. 批量为文件命名

1) eval函数 

R=[1 2 3;4 5 6; 7 8 9];
for i=1:3 
    eval(['T',num2str(i),'=','R(i,:)',';']);    % 分别令T1=[1 2 3]...
end

2) sprintf函数

numFiles = 3;
for n = 1:numFiles
   randomData = rand(n);
   currentFile = sprintf('myfile%d.mat',n);
   save(currentFile,'randomData')            % 直接将文件命名后保存 
end

3) strcat

wd_path= 'C:\Users\Administrator\Desktop\1.14\';   %文件路径 
Newexcel_path='C:\Users\Administrator\Desktop\1.13\';
files = dir(strcat(wd_path,'*.txt'));      %%dir('.')列出当前目录下所有子文件夹和文件%
len = length(files);                    %文件的长度
for i=1:len
    oldname = files(i).name;
    newname=strcat('1.',int2str(i+54),'.txt');
    command = ['rename' 32 oldname 32 newname];
    status = dos(command);
    movefile(newname,Newexcel_path);
end

5. 数据归一化处理:

    把每组数据都变为-1~+1之间的数,所涉及到的函数有premnmx ,

    post mnmx , tramnmx。详见主页“数据归一化 normlization.m 及与mapminmax区分

6. 对一组数据随机排列 randperm

randperm:将一列序号随机打乱,序号必须是整数。

P=randperm(N) 返回一个包含N个在1到N之间产生的随机元素的向量

p = randperm(N,k)  从1到N的数字序列里面随机返回k个数

想对一组数据随机重排,来提高计算结果的普遍性和精度:

temp = randperm(size(X,1));      
P_train = NIR(temp(1:50),:);     
P_test = NIR(temp(51:end),:);

举例: 

>> a=randperm(6)

a =

     3     4     5     2     6     1

>> m=[1,2,3,4,5,6;96,5,4,3,2,1]

m =

     1     2     3     4     5     6
    96     5     4     3     2     1

>> b=m(:,a(1:5))

b =

     3     4     5     2     6
     4     3     2     5     1

7. 添加路径和删除路径

addpath(genpath('要添加的路径'))       % 添加目录到path
addpath(genpath(pwd))       % 将当前文件夹下的所有文件夹都包括进调用函数的目录
rmpath(pwd)              % 删除当前文件夹的路径
rmpath(genpath(pwd))     % 移除当前文件夹以及所有子文件夹的路径

举例:

folder ='wavelet_pansharp';  % 要操作的文件夹
addpath( genpath(folder) );   
pause(20);   % 暂停20s,仅用来观察代码实现的效果。
rmpath( genpath(folder)  );

8.函数调用 

[y1,y2]=fuction(x1,x2,x3...)

[y1]=fuction(x1,x2,x3...)

[,y2]=fuction(x1,x2,x3...)

9. 寻找两矩阵中不同的元素

i=find(X1~=X2);         % 得出矩阵对应位置

9.转)matlab批量处理数据

(12条消息) matlab批量处理excel(CSV)文件数据_好玩的Matlab的博客-CSDN博客_matlab批量读取csv文件

(12条消息) matlab自动读取目录下的所有文件数据,并保存为.mat文件_clw_18的博客-CSDN博客_matlab数据保存为mat

(12条消息) 傻瓜攻略(十)——MATLAB实现.mat文件内部变量的批量处理_素观江湖真的博客-CSDN博客_批量处理mat文件

 参考链接:

【新提醒】写给MATLAB新手的几句话(值得一看)|论坛帮助|MATLAB技术论坛 - Powered by Discuz! (matlabsky.com)

MATLAB 如何导入.txt文本_WW、forever的博客-CSDN博客_matlab导入txt数据

 如果对你也有帮助 点个赞支持一下吧 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐