可以看出,我必须从excel导入此文件并将其转换为如图所示的结构。我已经能够开发一个代码,可以通过手动输入Id编号来创建结构。例如,如果我输入150,它会给出150的结构,如图所示。
但是我必须自动化这个过程,即我希望matlab识别唯一的ID,并在每个ID中创建整个结构及其所有数据和时间。
这是我的代码
function [ DynData ] = myfunction( filename )
[dat1, dat2, dat3] = xlsread(filename);
flds = dat3(1,:);
InputData = cell2struct(dat3(2:end,:),flds,2);
uIDs = unique( cell2mat(dat3(2:end, 2))) ;
for j = 1:length(dat3)
uIDs = dat3(j);
i=1;
for k = 2:length(dat3(:,1))
if dat3{k,2} == {uIDs}
IDnumber = ['ID',num2str(uIDs)];
DynData.(IDnumber).time(1,i) = dat3{k,1};
DynData.(IDnumber).ID(1,i) = dat3{k,2};
DynData.(IDnumber).data(1,i) = dat3(k,3);
i=i+1;
end
end
end
end
任何帮助都将非常感谢!
答案 0 :(得分:0)
我更喜欢将.xlsx加载到表中以便于访问。
尝试此功能:
如果id是数字,则不能直接将其用作结构中的字段名称。字段名称中的第一个字符必须是字母。您可以使用前缀
来解决此问题function dynData=tableImport(file)
% Imports data from .xls file with columns 'Time' 'Id' 'Data' into
% structure dynData with fieldnames=unique(id) each of which is in turn a
% struct array with fields Time and Data.
% Get data
tab=readtable(file);
% Group by id
G=findgroups(tab.Id);
% Extract id and structure
[id, st]=splitapply(@groupTable,tab,G);
% Build dynData
fieldNames=strsplit(sprintf('id%i\n',id));
for i=1:length(id)
dynData.(fieldNames{i})=st{i};
end
end
function [ID, struc]=groupTable(time,id,data)
% Function for finding id-name and splitting time and data into a struct.
ID=id(1);
struc={struct('Time',num2cell(time),'Data',data)}; % stored in cell
end
虽然如果我是你,我宁愿将我的数据存储在带有字段名
的结构数组中便于在for循环中访问
这是我试图建议的更好的结构:
function dynData=tableImport2(file)
% Imports data from .xls file with columns 'Time' 'Id' 'Data' into
% structure dynData with fieldnames=unique(id) each of which is in turn a
% struct array with fields Time and Data.
% Get data
tab=readtable(file);
% Group by id
G=findgroups(tab.Id);
% Extract id and structure
dynData=splitapply(@(time,id,data)struct('Id',id(1),'Time',time,'Data',{data}),tab,G);
end