【问题标题】:Constructing a structure in matlab在matlab中构造一个结构
【发布时间】:2016-08-11 11:22:04
【问题描述】:

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

如您所见,我必须从 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

任何帮助将不胜感激!

【问题讨论】:

  • 第一个改进,您可以避免使用符号~ 存储不需要的变量。 [~,~,dat] = xlsread('filename');
  • 很容易做到。首先像您一样获取唯一 ID,然后使用 arrayfun(迭代唯一 ID),然后选择第二列正是迭代 ID 的相应行。

标签: matlab structure


【解决方案1】:

我更喜欢将我的 .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(字符串)
  • 时间(数组)
  • 数据(数组/单元数组)

在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

【讨论】:

  • 感谢您的详细回答,但是,我尝试使用您的代码,但在线出现错误;选项卡 = 可读(文件);每当我尝试调用函数 tableImport('test') - 其中 test.xlsx 是 excel 文件时,它会给出以下错误:使用 readtable(第 129 行)无法打开文件'test'。 tableImport 中的错误(第 7 行)tab=readtable(file);
  • 你确定你已经给出了完整的文件路径还是文件在你的路径/当前文件夹中?听起来您可能在其他地方打开了文件?也许在fopen?或者在没有正确权限的情况下保存。
  • 谢谢。我能够让它工作,但现在它给出了以下错误:来自非单元格数组对象的单元格内容引用。 tableImport 中的错误(第 16 行)dynData.(id{i})=st{i};
  • 因此,我尝试将 {} 括号替换为 () 括号,但仍然无法正常工作。请帮忙
  • 您的表格看起来像图像中的还是列不同? id 是数字还是字符串?如果它是一个数字,它将不起作用,因为 MATLAB 不允许不以字母开头的字段名称。
猜你喜欢
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多