How to simply the code

2 ビュー (過去 30 日間)
Riccardo Tronconi
Riccardo Tronconi 2021 年 7 月 20 日
回答済み: Peter Perkins 2021 年 7 月 27 日
Dear guys I have addressed this code but I would appreciate to know if there is a more efficient way to compute this operation.
I have C = mx2 as input data in which:
Column 1 Column 2
'05-Mar-2021 11:41:37.000000000' 1.82586529734179
'05-Mar-2021 11:41:38.000000000' 1.77388482137334
'05-Mar-2021 11:41:39.000000000' 1.88714319565667
'05-Mar-2021 11:41:40.000000000' 2.29089559960008
'05-Mar-2021 11:41:41.000000000' 2.30346664313351
'05-Mar-2021 11:41:42.000000000' 1.87713583687103
'05-Mar-2021 11:41:43.000000000' 1.76028809274914
'05-Mar-2021 11:41:44.000000000' 2.29089559960008
'05-Mar-2021 11:41:45.000000000' 1.91069619238497
'05-Mar-2021 11:41:46.000000000' 1.87713583687103
'05-Mar-2021 11:41:47.000000000' 1.70193502387195
'05-Mar-2021 11:41:48.000000000' 1.95785425847213
'05-Mar-2021 11:41:49.000000000' 1.87823181906136
I loop over each row and I stay inside a while loop if the value in the second column is lower than 2. Once, it is greater than the threshold I exit and it is computed the difference between the first timestamp to the last one to find the duration.
is it possibile to simply the code?
  2 件のコメント
Yongjian Feng
Yongjian Feng 2021 年 7 月 20 日
You want to post your code here, so others can review?
Jan
Jan 2021 年 7 月 20 日
Is your data a cell array or a table?

サインインしてコメントする。

採用された回答

Jan
Jan 2021 年 7 月 20 日
編集済み: Jan 2021 年 7 月 20 日
With some guessing:
Value = cat(1, C{:, 2});
Index = find(Value >= 2, 1, 'first') - 1;
if ~isempty(Index) % [EDITED]
Time1 = C{1, 1};
Time2 = C{index, 1};
Duration = datetime(Time2) - datetime(Time1)
else
% What do you want to do, if no element matchs?
end
  4 件のコメント
Jan
Jan 2021 年 7 月 20 日
@Riccardo Tronconi: I've inserted a check, if no value is found.
The shown procedure should work for an arbitrary number of rows.
Riccardo Tronconi
Riccardo Tronconi 2021 年 7 月 20 日
thanks!!

サインインしてコメントする。

その他の回答 (1 件)

Peter Perkins
Peter Perkins 2021 年 7 月 27 日
"I'm working with cell arrays": Riccardo, you don't want to be doing that, especially not with 100000 rows. Or using a loop for that matter.
I think the following does what you want, though I'm not actually 100% sure what that is.
>> t = datetime({'05-Mar-2021 11:41:37.000000000'
'05-Mar-2021 11:41:38.000000000'
'05-Mar-2021 11:41:39.000000000'
'05-Mar-2021 11:41:40.000000000'
'05-Mar-2021 11:41:41.000000000'
'05-Mar-2021 11:41:42.000000000'
'05-Mar-2021 11:41:43.000000000'
'05-Mar-2021 11:41:44.000000000'
'05-Mar-2021 11:41:45.000000000'
'05-Mar-2021 11:41:46.000000000'
'05-Mar-2021 11:41:47.000000000'
'05-Mar-2021 11:41:48.000000000'
'05-Mar-2021 11:41:49.000000000'});
>> x = [1.82586529734179
1.77388482137334
1.88714319565667
2.29089559960008
2.30346664313351
1.87713583687103
1.76028809274914
2.29089559960008
1.91069619238497
1.87713583687103
1.70193502387195
1.95785425847213
1.87823181906136];
>> t = table(t,x)
t =
13×2 table
t x
____________________ ______
05-Mar-2021 11:41:37 1.8259
05-Mar-2021 11:41:38 1.7739
05-Mar-2021 11:41:39 1.8871
05-Mar-2021 11:41:40 2.2909
05-Mar-2021 11:41:41 2.3035
05-Mar-2021 11:41:42 1.8771
05-Mar-2021 11:41:43 1.7603
05-Mar-2021 11:41:44 2.2909
05-Mar-2021 11:41:45 1.9107
05-Mar-2021 11:41:46 1.8771
05-Mar-2021 11:41:47 1.7019
05-Mar-2021 11:41:48 1.9579
05-Mar-2021 11:41:49 1.8782
>> t.run = cumsum(x >= 2)
t =
13×3 table
t x run
____________________ ______ ___
05-Mar-2021 11:41:37 1.8259 0
05-Mar-2021 11:41:38 1.7739 0
05-Mar-2021 11:41:39 1.8871 0
05-Mar-2021 11:41:40 2.2909 1
05-Mar-2021 11:41:41 2.3035 2
05-Mar-2021 11:41:42 1.8771 2
05-Mar-2021 11:41:43 1.7603 2
05-Mar-2021 11:41:44 2.2909 3
05-Mar-2021 11:41:45 1.9107 3
05-Mar-2021 11:41:46 1.8771 3
05-Mar-2021 11:41:47 1.7019 3
05-Mar-2021 11:41:48 1.9579 3
05-Mar-2021 11:41:49 1.8782 3
>> rowfun(@(t,x)t(end) - t(1), t, "InputVariables","t","GroupingVariables","run")
ans =
4×3 table
run GroupCount Var3
____ __________ ________
0 3 00:00:02
1 1 00:00:00
2 3 00:00:02
3 6 00:00:05
I've used a table, not a timetable because rowfun doesn't currently let you use the row times as a data variable.

カテゴリ

Help Center および File ExchangeNumeric Types についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by