Finding a pattern in a table and the coordinates of the "first hit"

30 次查看(过去 30 天)
I have a table like this:
'NaN' NaN NaN
'NaN' NaN NaN
'NaN' NaN NaN
'07:02:58.830' 1 NaN
'07:02:58.830' 1 831
'07:02:58.830' 1 NaN
'07:02:58.830' 1 NaN
'07:02:58.830' 1 831
'NaN' NaN NaN
'07:02:59.430' 2 NaN
'07:02:59.430' 2 831
'07:02:59.430' 2 819
'07:02:59.430' 2 819
The first column contains the time in the format X:Y:Z.
What I need: I need to find this pattern in the first column and calculate the coordinates of the first hit.
What the result should look like: in the case of the table in question, the result should be the coordinate of the cell in which this pattern occurs for the first time. In this case, it is [row,col] = [4,1];

回答(2 个)

Sameer
Sameer 2024-11-14,10:53
编辑:Sameer 2024-11-14,10:56
To find the first occurrence of a specific pattern in the first column of your table you can create a duration object from a time string ('07:02:58.830') and search for its first occurrence in table's first column using find
Here's how you can do it:
load('Table.mat');
pattern = duration('07:02:58.830', 'Format', 'hh:mm:ss.SSS');
firstColumn = Table{:, 1};
% Find the index of the first occurrence of the pattern
index = find(firstColumn == pattern, 1);
if ~isempty(index)
fprintf('The first occurrence of the pattern is at [row, col] = [%d, %d];\n', index, 1);
else
fprintf('Pattern not found.\n');
end
The first occurrence of the pattern is at [row, col] = [4, 1];
Please refer to below MathWorks documentation links:
Hope this helps!
  2 个评论
Andrew Sol
Andrew Sol 2024-11-14,11:04
编辑:Andrew Sol 2024-11-14,11:05
Thank you for your answer! And if the time is unknown in advance and you I to find a time pattern (the time can be any, the main thing is that it is in the format 'hh:mm:ss.SSS'), how will the code change?
In other words: how to find the first occurrence of an arbitrary time of a given format in a table?
Sameer
Sameer 2024-11-14,11:57
load('Table.mat');
firstColumnStr = cellstr(Table{:, 1});
timePattern = '\d{2}:\d{2}:\d{2}\.\d{3}';
index = find(~cellfun('isempty', regexp(firstColumnStr, timePattern)), 1);
if ~isempty(index)
fprintf('The first occurrence of the time pattern is at [row, col] = [%d, %d];\n', index, 1);
else
fprintf('Time pattern not found.\n');
end
The first occurrence of the time pattern is at [row, col] = [4, 1];

请先登录,再进行评论。


Image Analyst
Image Analyst 2024-11-14,15:16
Another way is to use ismember
% Load data from .mat file.
S = load('Andrew Table.mat');
t = S.Table;
% Extract first column into it's own variable (optional - just for convenience).
times = t{:, 1}; % This variable is of type "duration".
% Define the pattern we are trying to find
pattern = duration([07,02,58.830])
pattern = duration
07:02:58
% Find the first row where it occurs
[~, matchingRow] = ismember(pattern, times)
matchingRow = 4

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

产品


版本

R2024a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by