matlab常用代码(读取文件、批量导入数据、与或非)
学习matlab过程中收集的一些常用代码。包括批量导入数据、读取/写入不同类型的文件、与或非、cell、randperm的使用等
学习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数据
如果对你也有帮助 点个赞支持一下吧
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)