在关联问题中,我们讲过如何利用python将mat文件存为excel,但是excel有个问题,那就是最多存储255列数据,当我们数据很多的时候怎么办呢?
在这里,我选择mat文件。
关联问题:
应用需求:
在这里,我有多个mat文件,每个mat文件都只有一行[1x4096]的数据,现在我想把这些mat文件合并起来。
应用分析:
根据前面我们知道,合并这些mat文件不能再存到excel里了,只能存入mat中。
编程实现:
这里以合并两个mat文件为例,其他多个同理,只需要for一下即可。
Python版
首先,读取mat文件并加载数据
import scipy.io as scio import numpy as np dataFile = 'mat\BigBuckBunny05.mat' dataFile2 = 'mat\BigBuckBunny06.mat' data = scio.loadmat(dataFile) data = data['BigBuckBunny05'] data2 = scio.loadmat(dataFile2) data2 = data2['BigBuckBunny06']
然后利用numpy将data和data2按行合并
data = np.vstack((data,data2))
最后将data保存为mat字典即可。
scio.savemat('filename.mat', mdict={'filename': data})
Matlab版:
其实matlab更加简单,这是MATLAB完整程序,包含了循环读取操作。
clc
filepath='E:\00 大论文工作\10 第一部分工作\201904\3dcnn提取的特征\原始特征\'; %文件夹名字
for k = 1: 9 % 一共的个数
temp = cell2mat(struct2cell(load([filepath,'mat',num2str(k),'.mat']))); % 利用num2str表示1,2,3,4.。。[ ]里面的内容,用逗号或者空格连接都可以,最后就是一个字符串,就是mat的路径名,temp读出来是一个structure
matname = char(fieldnames(temp));% 获取结构成员名称
data{k} = getfield(temp,matname);% 获取该名称下的成员内容,用 temp.usertrj_stay 也可以获得structure的值
end
for k = 10: 99 % 一共的个数
temp = cell2mat(struct2cell(load([filepath,'mat',num2str(k),'.mat']))); % 利用num2str表示1,2,3,4.。。[ ]里面的内容,用逗号或者空格连接都可以,最后就是一个字符串,就是mat的路径名,temp读出来是一个structure
matname = char(fieldnames(temp));% 获取结构成员名称
data{k} = getfield(temp,matname);% 获取该名称下的成员内容,用 temp.usertrj_stay 也可以获得structure的值
end
for k = 100: 450 % 一共的个数
temp = cell2mat(struct2cell(load([filepath,'mat',num2str(k),'.mat']))); % 利用num2str表示1,2,3,4.。。[ ]里面的内容,用逗号或者空格连接都可以,最后就是一个字符串,就是mat的路径名,temp读出来是一个structure
matname = char(fieldnames(temp));% 获取结构成员名称
data{k} = getfield(temp,matname);% 获取该名称下的成员内容,用 temp.usertrj_stay 也可以获得structure的值
end
s1=cell2mat(struct2cell(load('qiyipuzong.mat')));
ll_staypoint = cat(1,data{:});
save('all_staypoint.mat');
注意事项:
这里关键是如何找到mat的字典头
我们以上面的例子为例,我们是如何知道mat中的索引是BigBuckBunny05呢?如果这个文件是自己建的,当然没问题,如果是直接copy来的,按一下步骤查找索引:
首先读取mat文件,然后在下面设置断点:
运行debug,查看data的数据结构:
这里可以看到,BigBuckBunny05即为ndarray的索引。可以打开看看
确认之后即可读取该索引的数据。
本文最后更新于2022年10月28日,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!