2016-11-10 43 views
3

结构的逻辑索引可以说我有这样的结构:与各种尺寸的字段

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

它包含1×10载体,3x3x10多页阵列和4×10矩阵。现在说我只需要选择对应的指数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+场。如何编写索引脚本?确切的问题发生局限于1×N向量,3×N和4×N矩阵和3×3×N阵列的结构。掩码是基于表示时间的矢量之一构造的。字段名称对于每个结构都是不变的,所以我可以蛮横强制事物并输入命令并将其作为函数运行,但我正在寻找一种智能的方式来对其进行索引。

更新:这是看起来很有前途的东西。

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 

回答

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); 
+0

这混淆了我 –

+1

@AnderBiguri允许在使用':''使索引与字符[有点不一致](http://stackoverflow.com/q/36189651/2586922),是 –