我有大型MATLAB表(2.000.000 x 30),它们在第一列中有一个时间戳,在第二列中有一个参数组关键字。第三列有参数名,下一列有参数值。随后是更多参数和值对。
示例数据:
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, ...
我的任务
我需要从此MATLAB表中提取与关键字列表匹配的条目(例如:m_IVS_AU_SystemManager_FlashLast
),并将时间戳和参数值保存到新的MATLAB表中。
是否有(快速)方式来执行
之类的操作rows = MyTable.parameterKeyword == 'm_IVS_AU_SystemManager_FlashLast'
就像MATLAB中的数字一样,如果在该行中找到关键字,则返回包含逻辑true(1)的逻辑数组,否则为零?
链接
答案 0 :(得分:2)
您可以使用ismember
,这将返回logical
数组。
例如:
% 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
如下所述,如果查询仅针对一个字符串,则strcmp
或strcmpi
可用于边际速度提升。
我在下面附上了简单的时间:
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
对于testcode(5e6)
,我的机器上的时间如下:
Timing for 5000000 entries (R2016a):
ismember: 0.09246
strcmp: 0.06575
strcmpi: 0.07284