2012-06-28 34 views
2

假設我有在MATLAB一個結構陣列:高效過濾MATLAB結構數組?

a= struct('a1',{1,2,3},'a2',{4,5,6}) 

我怎樣纔能有效地(即,與量化代碼),從而使它們滿足一些布爾屬性過濾結構的要素是什麼?

例如:

  1. 我怎麼會創建一個新的結構數組b,其元素是a的子集,其中a1是3 a2的倍數是3的倍數?預期結果是大小爲1的結構數組,其元素爲struct('a1', 3, 'a2', 6)
  2. 我將如何創建一個新的結構數組b,其元素是a的子集,其中a1是奇數a2是3的倍數?預期的結果是以下大小爲2的結構數組:struct('a1', {1,3}, 'a2', {4,6})

回答

3

您可以使用mod(...)函數和正確使用括號和引用來解決此問題。考慮

  1. Mod(x,3)將返回零,如果你的號碼是3 mod(x,2)的倍數將返回1,如果x是奇數。
  2. 通過鍵入[a.a1],您可以獲取您的所有a1a2值。只要輸入a.a1就會造成混亂。
  3. 您可以通過編寫a = a([1 3]);或通過編寫a = a(logical([1 0 1]))來獲得相同的結果來過濾我們的a結構。
  4. 對於邏輯或(see here),您可以使用&邏輯,|

總之,下面的代碼可以解決你的問題:

%% Part 1: 
a= struct('a1',{1,2,3},'a2',{4,5,6}); 
logForA1isMod3 = (mod([a.a1], 3) == 0); 
logForA2isMod3 = (mod([a.a2], 3) == 0); 

a = a(logForA1isMod3 & logForA2isMod3); 

%% Part 2: 
a= struct('a1',{1,2,3},'a2',{4,5,6}); 
logForA1isOdd = (mod([a.a1], 2) == 1); 

a = a(logForA1isOdd | logForA2isMod3);