2016-11-10 44 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),是 –