2012-03-18 83 views
2

我想要这个(数组=向量):如何在Matlab中创建载体中包含的结构域的投影?

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

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

例子:

所以,如果一开始我有姓名+年龄结构(参见下面的更新)的载体,我想创建投影,所以我最终随着年龄的载体(年龄的顺序) 。

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

error: cellfun: all values must be scalars when UniformOutput = true

我怀疑这是环境设置,但我不能切换的,因为我的代码将在陌生的环境中运行。

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

问题

如何让这样的 “组合拳” 投影在Matlab?

回答

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的还是1×3或阵列等,你写

age = cat(2,s.age); 

或者,如果你希望你的输出数组元素#2有两个条目(因为s(2).age有两个条目) ,你链状成CELL ARRAY

age = {s.age}; 

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

+0

谢谢,我恐怕我简化了我的问题太多了,因为当我运行你的代码时,它在我的情况下不起作用,因为我不时只是数字(年龄)而不是数字(年龄)的数字)。如何处理这种情况? – greenoldman 2012-03-18 13:24:02

+1

@macias:或者沿着不同的维度链接,或者创建一个单元格数组。看我的编辑。 – Jonas 2012-03-18 13:36:53

+0

Yuppi !!! :-)它工作非常好,非常感谢你,并再次抱歉,这种简化。 – greenoldman 2012-03-18 13:56:15