如何在Matlab中创建向量中包含的结构域的投影?

时间:2012-03-18 12:53:30

标签: arrays matlab map octave projection

我想要这个(array = vector):

array.Select(elem => elem.my_field).ToArray(); // C# + Linq
array map _.my_field // Scala, I believe

用简单的英语,我有矢量。每个元素都是结构。每个结构都有字段(任何类型)。现在,我想拥有“领域”的载体,而不是拥有它。

实施例

所以,如果最初我有名字+年龄结构的矢量(见下面的更新),我想创建投影,所以我最终得到了年龄的矢量(一系列年龄)。

我尝试了arrayfun功能,但这给了我错误:

  

错误:cellfun:当UniformOutput = true

时,所有值必须是标量

我怀疑这是环境设置,但我无法切换,因为我的代码将在外星环境中运行。

更新: 我过度简化了这个例子,对不起 - 年龄是一个数字,但有时它是一对数字。所以在一般情况下,我必须假设它可以是任意长度的数字向量(正如我在Matlab中理解的那样,一个数字是vector.length = 1)。

问题

如何在Matlab中进行这样的“组合”投影?

1 个答案:

答案 0 :(得分:3)

您可以使用cat来安排您的阵列:

s = struct('age',{10 20 20},'name',{'Bob','Max','Peter'})
1x3 struct array with fields:
    age
    name

age = cat(1,s.age)
age =
    10
    20
    20

如果您想使用arrayfun,请执行以下操作:

age = arrayfun(@(x)x.age,s);

修改

为了安排一个字段长度未知的结构,有两种选择:如果你只想要所有的“年龄”,那么“年龄”#5最终会在第6位结束并不重要,因为有对于“年龄”#2的两个条目,您沿着所有“年龄” - 阵列具有相同长度的维度进行分类。例如,如果它们都是1x1或1x2或1x3阵列等,则编写

age = cat(2,s.age);

或者,如果您希望输出数组的元素#2有两个条目(因为s(2).age有两个条目),那么您可以安排到CELL ARRAY

age = {s.age};

age的每个元素(由括号访问)是一个1x1单元格数组,可以包含任何大小的任何类数组;要访问单元格数组元素的内容,请使用大括号:age(2)是单元格数组的第二个元素,age{2}是所述元素的内容,即你的1x2数字数组。