具有各种尺寸字段的结构的逻辑索引

时间:2016-11-10 15:50:27

标签: matlab struct matrix-indexing

假设我有这样的结构:

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

1 个答案:

答案 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);