2016-08-30 20 views
0

大きなMATLABテーブル(2.000.000 x 30)(最初のカラムにタイムスタンプ、2番目のカラムにパラメータグループキーワード)があります。 3番目の列にはパラメータ名があり、次の列にはパラメータ値があります。より多くのパラメータと値のペアが続きます。大規模なMATLABテーブルで文字列(キーワード)を検索

例データ:

2012-08-28 13:37:46:573, m_IVS_AU_SystemManager_FlashLast, flashLast, 9, ...  
2012-08-28 13:37:46:573,m_IVS_AU_SystemManager_CPULast,cPULast,51, ...  
2012-08-28 13:37:46:573,m_IVS_AU_SystemManager_NetworkLast,networkLast,0, ...  
2012-08-28 13:37:48:558,m_F121_KantenKB,kantenKB,0, KantenKU, 1, ...  
2012-08-28 13:37:48:589,m_F121_HmiVollstaendig,hmiVollstaendig,TRUE:0, ...  
2012-08-28 13:37:49:042,m_F22_IVS_IsecTrkServiceState,isecTrkServiceState,3, ...  
2012-08-28 13:37:49:120,m_F121_HmiUpdate,hmiUpdate_PresentationsId,0, ... 

マイタスク

私は(例えば:m_IVS_AU_SystemManager_FlashLast)キーワードのリストと一致し、このMATLABテーブルからエントリを抽出するために必要とタイムスタンプを保存し、パラメータ値を新しいMATLABテーブルに追加します。論理真(1)キーワードは、その行で発見された場合は、そうでない場合を含む論理配列を返すMATLABでの数値のためにそこにあるよう

rows = MyTable.parameterKeyword == 'm_IVS_AU_SystemManager_FlashLast' 

のような何かをする(速い)方法がありますゼロ?

リンク

+0

あなたのテーブルまたは全体で特定の変数(列)を探していますもの? – excaza

+0

私はいつも特定のキーワードについて第2列を検索しています。 –

答えて

2

あなたはlogical配列を返しますされ、このためにismemberを使用することができます。例えば

% Dummy table 
B = table(['M';'F';'F';'F'],[47;31;35;23],[68;64;62;58],... 
'VariableNames',{'Gender' 'Age' 'Height'},... 
'RowNames',{'Joe' 'Meg' 'Beth' 'Amy'}); 

mask = ismember(B.Gender, 'F'); 
whos mask 

戻り値:

mask = 

    0 
    1 
    1 
    1 

    Name  Size   Bytes Class  Attributes 

    mask  4x1     4 logical 

後述するように、クエリのみ1つの文字列のためのものである場合、strcmp又はstrcmpiが限界速度の増加のために使用することができます。

私は、単純なタイミングの下に添付しました

:私のマシン上で次のようにタイミングがあるtestcode(5e6)について

function testcode(nentries) 
A = table(repmat({'hi'}, nentries, 1), 'VariableNames', {'Thing1'}); 

t1 = timeit(@()ismember(A.Thing1, 'hi')); 
t2 = timeit(@()strcmp(A.Thing1, 'hi')); 
t3 = timeit(@()strcmpi(A.Thing1, 'hi')); 

tmp = ver; 
fprintf(['Timing for %d entries %s:\n' ... 
     ' ismember: %.5f\n' ... 
     ' strcmp: %.5f\n' ... 
     ' strcmpi: %.5f\n\n'], nentries, tmp.Release, t1, t2, t3); 
end 

Timing for 5000000 entries (R2016a): 
    ismember: 0.09246 
    strcmp: 0.06575 
    strcmpi: 0.07284 
+0

ありがとう、これは完全に動作します。 –

+0

'strcmp'は、探している文字列が1つしかない場合にも使用できます。これは' strcmpi'で大文字と小文字を区別しないようにすることができます。 –

+1

@SomeGuy true、私は比較を追加しました – excaza

関連する問題