S
。每个字段都包含一个数字向量,所有这些向量都具有相同的大小,比如nx1
。
现在我想根据选择的字段创建一个数字矩阵。
起点是一个大小为mx1
的逻辑掩码,其中m是S
的字段数。如果mask(i)
的第i个字段应包含在矩阵中,则true
为S
。因此矩阵大小为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
的创建应该动态依赖于S
和mask
的字段。
有没有办法实现这个没有使用丑陋的构造,包括结构字段名称,循环等的过滤器?
非常感谢!
菲利普
答案 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