假设我有这样的结构:
S.index = 1:10;
S.testMatrix = zeros(3,3,10);
for x = 1:10
S.testMatrix(:,:,x) = magic(3) + x;
end
S.other = reshape(0:39, 4, 10);
它包含1x10矢量,3x3x10多页面阵列和4x10矩阵。现在说我想只选择与2到8之间的索引相对应的条目。mask = S.index > 2 & S.index < 8;
我首先尝试了structfun(@(x) x(mask), S, 'UniformOutput', 0);
,它只适用于矢量,这非常有意义。所以我认为我需要做的就是扩展我的面具。所以我这样做了。
test = structfun(@(x) x(repmat(mask, size(x, ndims(x) - 1), 1)), S, 'UniformOutput',0);
展开的mask
对于矩阵是正确的,但对于多页面数组则不正确。并且2D矩阵被展平为矢量。
如果我要单独索引这些元素,我会做这样的事情:
S2.index = S.index(mask);
S2.other = S.other(:,mask);
S2.testMatrix = S.testMatrix(:,:,mask);
我的用例是数百个结构,每个结构有20多个字段。如何编写索引脚本?出现的确切问题仅限于具有1xN向量,3xN和4xN矩阵以及3x3xN阵列的结构。基于表示时间的向量之一构造掩模。字段名称对于每个结构都是常量的,所以我可以强制插入命令并输入命令并将其作为函数运行,但我正在寻找一种智能的索引方法。
更新:这看起来很有希望。
fn = fieldnames(S);
for x = 1:length(fn)
extraDim = repmat({':'}, 1, ndims(S.(fn{x})) - 1);
S2.(fn{x}) = S.(fn{x})(extraDim{:}, mask);
end
答案 0 :(得分:4)
您可以利用the string ':'
can be used as an index代替:
的事实,并为每个字段重复构建该字符串comma-separated list适当的次数:
s = {':',':'}; % auxilary cell array to generate the comma-separated list
S2 = structfun(@(f) f(s{1:ndims(f)-1}, mask), S, 'UniformOutput', false);