在matlab中构造一个结构

时间:2016-08-11 11:22:04

标签: matlab structure

有人可以帮我构建这个结构吗?

可以看出,我必须从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

任何帮助都将非常感谢!

1 个答案:

答案 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

虽然如果我是你,我宁愿将我的数据存储在带有字段名

的结构数组中
  • id(string)
  • time(array)
  • data(array / cellarray)

便于在for循环中访问

更新2

这是我试图建议的更好的结构:

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