从标量结构的字段动态创建数值矩阵

时间:2014-08-21 13:45:02

标签: matlab structure

在Matlab中,我有一个带有一些字段的标量结构S。每个字段都包含一个数字向量,所有这些向量都具有相同的大小,比如nx1

现在我想根据选择的字段创建一个数字矩阵。

起点是一个大小为mx1的逻辑掩码,其中m是S的字段数。如果mask(i)的第i个字段应包含在矩阵中,则trueS。因此矩阵大小为n x sum(mask)

示例(在我的代码中,结构不是以这种方式构建的,当然:-)

vec = rand(1000,1);
S.f1 = vec;
S.f2 = vec;
S.f3 = vec;
S.f4 = vec;
S.f5 = vec;

mask = [false true true false false]; % 5 elements because S has 5 fields

预期输出为:

output = [S.f2 S.f3];

但当然,output的创建应该动态依赖于Smask的字段。

有没有办法实现这个没有使用丑陋的构造,包括结构字段名称,循环等的过滤器?

非常感谢!

菲利普

3 个答案:

答案 0 :(得分:5)

这是一种方式 -

fns = fieldnames(S) %// Get all fieldnames
S = rmfield(S,fns(~mask)) %// Remove all fields with masking values as false

接下来,要获取数字数组,请使用struct2array -

output = struct2array(S)

答案 1 :(得分:2)

您可以使用struct2cell将结构转换为单元格,并使用常规单元格索引来获取所需的字段。

a = (1:5).';
s.f1 = a; s.f2 = 2*a; s.f3 = 3*a; s.f4 = 4*a; s.f5 = 5*a;
c = struct2cell(S);
[c{mask}]  
ans =

     2     3
     4     6
     6     9
     8    12
    10    15

答案 2 :(得分:0)

您可以执行以下操作:

msks = fieldnames(S);
msks = msks(mask);
n = numel(msks);
output = zeros(1000,n);
for i = 1:n
    output(:,i) = S.(msks{i});
end