文章目录
对结构体struct的操作
deal 把输入处理成输出
fieldnames 获取结构的字段名
getfield 获取结构中指定字段的值
rmfield 删除结构的字段(不是字段内容)
setfield 设置结构数组中指定的字段的值
struct 创建结构数组
struct2cell 结构数组转化成元胞数组
isfield 判断是否存在该字段
isstruct 判断某变量是否是结构类型
@ 需求一:读取结构体内容
由于结构体是有字段名称的,所以建议先将结构体转换为元胞数组,然后再进行内容的读取。
% 获取struct数据个数
num = length(struct_) - 2;
% struct转换为cell类型
cell_ = struct2cell(struct_);
% 读取cell中第i行第j列的数据
data = cell_{i,j}
对元胞数组cell的操作
获取元胞数组的大小:
[row, col] = size(cell)
判断元胞数组是否为空:
isempty(cell_{1})
在元胞数组后追加元素:直接使用中括号即可
a = [cell_, 'a']
注意:
索引元组的内容时,使用花括号 cell{i,j}
来获取第 i 行第 j 列的内容。
对图片数据的操作
@ 需求一:读取/显示图片
% 读取图片
img = imread('cat.jpg');
% 显示图片
imshow(img);
@ 需求二:将矩阵保存为图片
imwrite(mat2gray(matrix), 'matrix.tif');
imwrite(uint8(matrix)), 'matrix.tif' )
第一种方法,不管matrix原先是double或者uint8类型,数据均被扩展到0-255的范围。好处是打开图片后就是需要的效果,缺点是再次load该矩阵时,值不反应原来的数值,而是0-255区间的。
第二种方法,缺点是打开图片后色彩和理想的不同,好处是完整的保存了原来的数据。load后可直接使用。注意,若想要保存图片为 uint8
类型,而当前矩阵为 double
类型且元素值不在 0 ~ 1 区间内,不能直接使用 im2uint8()
保存,否则保存的图片只有 0 和 1 两种数值。正确的做法是先将矩阵中元素值映射到 0 ~ 1 之间,然后再保存即可。
对字符串的操作
@ 需求一:连接多个字符串
% 连接两个字符串
方法一: c = [a, b]
方法二: c = strcat(a, b)
% 连接多个字符串
d = sprintf('%s,%d,%s', a, b, c)
@ 需求二:查找/删除特定字符串
strrep:查找并替换子字符串
% 将 str 中的 old 替换为 new
newStr = strrep(str,old,new)
删除只需要用空字符替换即可,即把第三个参数设置为空字符:''
@ 需求三:比较字符串相等
strcmp(str1, str2);
>>> str1和str2相等时返回1,不等则返回0
@ 需求四:分割字符串
使用 strsplit
方法,第一个参数为待分割的字符串,第二个参数可以不填,可以为某个字符,也可以为包含多个字符的元胞数组。
strsplit(str) % 默认按空白字符分割字符串
strsplit(str, '-') % 按照-分割字符串
strsplit(str, {'/', '-'}) % 按照/和-分割字符串
@ 需求五:字符串转数字
% 数字转字符串
str_ = num2str(123);
% 字符串转数字
num_= str2num('123');
对矩阵的操作
@ 需求一:在矩阵中查找特定元素
(1) 查找满足条件的元素,返回一个 0-1 矩阵
M = (A > 0)
返回和矩阵 A 形状相同的 0-1 矩阵 M,其中满足条件的元素为 1,反之为 0。
(2) 查找满足条件的元素,返回元素位置(单下标)
1. t = find(A > 0)
2. t' = (find(A > 0))'
t
:返回为 n 行 1 列
t‘
:想要保存为 1 行 n 列转置一下就好啦~
注意:这里返回的是单下标,下标是按列数的
(3) 查找满足条件的元素,返回元素位置(双下标)
[i, j] = find(A==0);
disp(ii');
disp(jj');
(4) 查找满足多条件的元素
# 返回元素位置
a = [1 5 6;7 8 9;15 6 9]
x = find(a > 7 & a < 14)
>>
x = 5 8 9
# 统计个数
x = sum(sum(a > 7 & a < 14));
x = length(a(a > 7 & a < 14));
>>
x = 3
@ 需求二:将矩阵中满足条件的元素替换掉
A(s) = 0
将 A 矩阵 s 位置的元素都替换为 0
@ 需求三:求矩阵中某一个值的个数
1. sum(A(:)==a);
2. length(find(A==a));
3. logical = (A=a);
sum(logical(:));
5. sum(sum(A~=0)) % 求矩阵非0元素的个数
@ 需求四:求矩阵最值
% 求矩阵每一列的最小/大值
[col_min, index] = min(mat, [], 1) % min/max
[row)min, index] = min(mat, [], 2) % min/max
对文件(夹)的操作
@ 需求一:读取某文件夹下的内容
% 读取文件夹下的所有内容
D = dir('folder_name')
dir
返回一个结构数组,包含了文件夹 folder_name
下的子文件夹和子文件的一些信息,结构数组中第 1 个成员 name
是文件名,第 4 个成员 isdir
表示是否为文件夹。
注意:结构体第 1 个数组元素和第 2 个数组元素分别是 .
和 ..
,表示 当前目录 和 上层目录。所以如果需要求文件夹中子文件的个数,需要给长度减去 2。
% 读取文件夹下指定后缀的所有文件
D = dir('folder_name\*.png'); % 方法一
D = dir(strcat(path, '\', '*.png')); % 方法二
D = dir(fullfile(path, '*.png')); % 方法三
@ 需求二:获取某文件夹下的文件个数
(1) 直接获取文件夹下子文件个数,但是要记得减去 2
D = dir('folder_name');
len = length(D)-2;
(2) 如果只需要获取某一后缀或文件名中包含某一特定字符的文件个数,可以在 dir 内进行指定,此时就不用再减 2 了
D = dir(sprintf('%s\\*.png', folder_name));
len = length(D);
这里指定了获取 folder_name
文件夹下所有后缀为 .png
的文件个数。
@ 需求三:读写某文件内容
# 第一步当然是打开想操作的文件了
fid = fopen(file_name,‘打开方式’);
fid
存储文件句柄值,如果 fid > 0
,则说明文件打开成功。
打开方式有如下选择:
‘r’
:只读方式打开文件(默认),文件必须已存在;‘r+’
:读写方式打开文件,打开后先读后写,文件必须已存在;‘w’
:打开后写入数据,文件已存在则更新,不存在则创建;‘w+’
:读写方式打开文件,先读后写,文件已存在则更新,不存在则创建;‘a’
:在打开的文件末端添加数据,文件不存在则创建;‘a+’
:打开文件后,先读入数据再添加数据,文件不存在则创建。
另外,在这些字符串后添加一个t
,如 ‘rt’
或 ‘wt+’
,表示将该文件以文本方式打开;如果添加的是 b
,则以二进制格式打开(默认)。
(1) 基本的写入方法
fid = fopen('info.txt', 'w'); # 打开文件
fprintf(fid, '%d \r\n', number); # 写入 number
fclose(fid); # 关闭文件
\r\n
的作用相当于键盘的 Enter 键,换行并回到行开头- 输出函数第一个位置放句柄
fid
,表示要向这个文件里写内容 - 在最后要记得关闭文件
- 另外要向文件中打 Tab,可以在需要的位置加
\t
关于打开方式 ‘a’
和 'w'
:
‘a’
代表后续写入,这样每次重新运行程序不会替换之前保存的数据,只是接着之前的数据向后继续添加新的内容;
‘w’
代表写入,它每写一次数据都会覆盖之前的数据,最后会发现目标文件里面只保存了一次运行的数据内容。
(2) 向打开的文件写入一个矩阵
fid = fopen('info.txt', 'w');
[r,c]=size(matrix);
for i = 1:r
for j = 1:c
fprintf(fid,'%5f\t',matrix(i,j));
end
fprintf(fid,'\r\n');
end
fclose(fid);
@ 需求四:将文件保存在指定目录下
直接用前面的方法 MATLAB 会将我写的文件保存在当前目录下,要指定保存目录很简单,只要在文件名前加上路径就好啦
fid = fopen('D:\data\info.txt', 'w');
fprintf(fid,'%d \r\n', number);
@ 需求五:利用循环向文件写入字符串
strings = {'R','G','B'};
fid = fopen('info.txt', 'w');
for n = 1:3
fprintf(fid, '%s\t', char(strings{n}));
end
fprintf(fid,'\r\n');
fclose(fid);
最后记得关闭文件:fclose
@ 需求六:查找文件中的关键字并提取关键字后的数据
feof(fid):文件指针 fid 到达文件末尾时返回“真”值;否则返回“假”;
~feof 是在 feof 前加了“非”,是逻辑表达式:文件指针到达文件末尾时 该表达式值为“假”;否则为“真”;
while ~feof 表示 若 未读到文件末尾 则 继续 循环
while feof 表示 若 未读到文件末尾 则 终止 循环,所以只循环一次就终止了
fgetl:读取文件中的行,并删除换行符
strtok:所选的字符串部分
strfind:在一个字符串内查找另一个字符串
@ 需求七:批量重命名文件
for i = 0:test_num-1
out_path = sprintf('E:\\data\\prostate\\_prostate\\experiment\\DEXTR\\exp\\exp%d\\test\\epoch%d\\%d\\mask\\result_795', id, epoch, i);
out_file = dir(sprintf('%s\\*.png', out_path));
for j = 1:len
oldname = out_file(j).name;
oldname = [out_path '\' oldname];
newname = N(j,1);
newname = newname{1};
eval(['!rename' 32 oldname 32 newname]);
end
fprintf('noise i is Done.. \n');
@ 需求八:判断存在并创建文件夹
if ~exist(file_path)==1
mkdir(file_path);
end
@ 需求九:移动复制文件
# old变成new,old被替换
movefile('old.txt', 'new.txt');
# old复制未new,old仍存在
copyfile('old.txt', 'new.txt');
# old文件移动到文件夹new中
movefile('old.txt', 'new');
# old文件复制到文件夹new中,old原本的文件夹中仍然有old
copyfile('old.txt', 'new');
对csv文件操作
读取 csv 文件
直接将 csv 文件全部读入,保存在一个矩阵中:
% 保存在矩阵f中
filename = 'info.csv';
f = csvread(filename);
对excel文件操作
读取 excel 文件 sheet1 的数据,数据区域选取规则:对表格前几个含有非数值的行(列)直接忽略,不算入数据区域;另外如果在数据区域中含有非数值的单元,将其处理为nan。
data = xlread('filename.xls');
对txt文本操作
写入文本:
fid = fopen(file, 'w');
fprintf(fid, 'content')
在 windows 系统中,\r\n
是回车换行,\t
是制表符
data = importdata('data.txt')
data 是一个结构数组,保存了 data.txt 文本文档里的内容
[a,b,c,d] = textread('data.txt','%2s %.3f %.3f %.3f');
这个可指定每部分输出内容的格式
json文件处理
text = jsonencode(data)
参考:https://ww2.mathworks.cn/help/matlab/ref/jsonencode.html
mhd文件处理
读取 mhd 文件
mhd = read_mhd(mhd_file)
随机数
需求:随机生成固定范围内的一些整数
randperm:随机置换
# 随机生成1~3000范围内的100个整数
r = randperm(3000, 100);
需求:为了便于调试程序,要求每次生成的随机数一样
# 设定随机数种子seed,具体数字可以改
rand('seed', 0);
图像处理
填补孔洞:
I_target = imfill(I_target, 'holes');
神奇函数 find()
参考:https://www.cnblogs.com/anzhiwu815/p/5907033.html