MATLAB 笔记


对结构体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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃饭就会放大招

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值