在matlab中使用python接口

随着python的流行,matlab逐渐支持python的部分功能。
python在字符串处理和文件读写上比matlab方便许多,在这些场景下使用python显然更省事。
下面介绍如何在matlab中调用python的接口。

示例代码

main.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
root_dir = '/data3/Human36M/Bbox/S%d/MySegmentsMat/ground_truth_bb';
save_dir = '/data2/guoyu/workspace/pytorch-3dpose/BBox_par';
S = [1,5,6,7,8,9,11];
for i =1:1:7
subject = S(i);
cur_dir = sprintf(root_dir,subject)
fileList = py.os.listdir(cur_dir);
fileList = cell(fileList);
fileList = cellfun(@char, fileList, 'UniformOutput', false);
for j =1:1:length(fileList)
filename = fileList(j);
filepath = fullfile(cur_dir,filename);
F = load(filepath{1});
M = F.Masks;
Bbox = zeros(length(M),4);
fork =1:length(M)
Bbox(k,:) = getBbox_par(M{k});
end
save_cur_dir = fullfile(save_dir, ['S',num2str(S(i))]);
savepath = fullfile(save_cur_dir,[filename{1}(1:end-4),'.h5'])
if ~py.os.path.exists(save_cur_dir)
py.os.makedirs(save_cur_dir);
end
h5create(savepath,'/bbox',size(Bbox))
h5write(savepath,'/bbox',Bbox)
end
end
message = 'All Done'

getBbox.m

1
2
3
4
5
6
7
8
9
10
11
12
13
function [ start_x , start_y, end_x,end_y ] = getBbox( I )
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
S = find(I);
idx1 = S(1);
idx2 = S(end);
start_y = mod(idx1, 1002);
start_x = round(idx1/1002);

end_y = mod(idx2, 1002);
end_x = round(idx2/1002);

end

代码注释

1
2
3
fileList = py.os.listdir(cur_dir);
fileList = cell(fileList);
fileList = cellfun(@char, fileList, 'UniformOutput', false);

在matlab中,调用python接口需要统一的py.,在使用listdir之后,matlab中返回值是py.list类型,需要将其转换为cell类型才能在matlab中使用。
同样的,返回的字符串是py.str类型,需要用char进行类型转换。

1
2
3
if ~py.os.path.exists(save_cur_dir)
py.os.makedirs(save_cur_dir);
end

这里使用python中的os.path.exists()判断文件是否存在,在matlab中的返回值为0或者1。