从输入单元输出结构

时间:2014-03-21 09:32:34

标签: matlab

我有一个除了结构之外具有不同数据类型(cell,logical,double,char)的单元格。现在我必须编写一个函数来整理不同的数据类型,并输出具有这些数据类型字段的结构。字段必须根据它们在单元格中的外观出现。因此,如果单元格的第一个'n'元素是double,第(n + 1)个元素是char,那么输出结构的第一个字段将是double,第二个字段将是char。 下面是buildStructure是函数头的示例。 sa是输出结构。

ca = {'Moriarty', [true, false], false, {'Pink Suitcase'}}
sa = buildStructure(ca)
  sa=>
  char: {'Moriarty'}
  logical: {[true, false]  [false]}
  cell: {{'Pink Suitcase'}}

我尝试编写for循环以在不同的单元格中存储不同的数据类型。然而,我感到很失落。我怎样才能弄清楚出现哪种数据类型?为此,我将所有类存储在一个巨大的字符串中,然后使用'strfind'来查找特定数据类型的位置(因此是时间)。但它使事情变得复杂。任何帮助将不胜感激!感谢。

2 个答案:

答案 0 :(得分:2)

所有数据类型都有测试。参见:iscell,ischar,islogial等。他们的结果可用于索引输入。

您可以完成以下示例代码:

function out = magicfun(varargin)

il = cellfun(@islogical,varargin);
out = struct('logical',{varargin(il)});

答案 1 :(得分:1)

您可以使用class()isa()unique()来执行此操作。这就像bdecaf的方法,但这需要你为每种类型编写测试并使用各种函数。使用classisa将使用单个测试推广到任何类型的数据,并且写入时间会更短。

仅限确切类型

通过比较class()中的类名,您可以根据每个输入的确切(最具体)类型将输入分区为类型。 'stable'的{​​{1}}选项使输出字段按输入中第一次出现的类型的顺序排列。 (在生产代码中,我可能会省略unique(),因此输出排序基于类型名称进行规范化,但这取决于您的要求。)

'stable'

这是非常完整的,应该适用于任何不做傻事的事情,例如覆盖function out = break_types(in) %BREAK_TYPES Partition a cell array based on the types of its contents inTypes = cellfun(@class, in, 'UniformOutput',false); [types,ax,bx] = unique(inTypes, 'stable'); out = struct; for i = 1:numel(types) ix = (bx == i); out.(types{i}) = in(ix); end class()

isa()

考虑继承

如果您使用>> ca = {'Moriarty', [true, false], false, {'Pink Suitcase'}}; >> break_types(ca) ans = char: {'Moriarty'} logical: {[1 0] [0]} cell: {{1x1 cell}} >> ,您还将获取类的继承关系。对于基本的Matlab类型,这将给出与其他实现相同的答案。但是对于从其他类型继承的类,它会将它们分类为它们在输入和必需列表中匹配的所有类型。

isa()

如果要确保输出结构具有某些类型的条目,即使没有该类型的输入(因此其字段将包含空数组),只需将这些类型名称附加到类型,然后再将它们传递给唯一类型:

function out = break_types(in)
%BREAK_TYPES Partition a cell array based on the types of its contents

inTypes = cellfun(@class, in, 'UniformOutput',false);
types = unique(inTypes, 'stable');
out = struct;
for i = 1:numel(types)
    ix = cellfun(@(x) isa(x, types{i}), in);
    out.(types{i}) = in(ix);
end