从文本文件中读取特定数据并计算结果

Read specific data from a text file and calculate a result

我必须从文本文件中读取数据:

如何找到机器 ON 的总时间? 我可以获得机器开启时的个别时间,但我似乎无法弄清楚如何添加它以获得总 on 时间。

注意:简单地添加它不会给出答案。总准时应为 31.

通过插值使用时间戳构建状态图


输出结果:


读入数据:

这道题有读取数据和评估数据两个关键部分。 textscan()函数可用于读取格式规范为%d %f %s的数据。这表示第 1 列应 read/scanned 作为整数,%d,第 2 列作为浮点数,%f,第 3 列作为字符串,%s。在此示例中,所有这些数据都被扫描到一个名为 Data 的元胞数组中。


正在分析数据:

Data 的列分成各自的数组后,可以计算与“on”时间对应的行。这里的 contains() 函数用于评估 Status array/column 中的行显示为“on”。当在数组中找到第二个参数时,contains() 函数 returns 为真“1”,否则对于第一个参数中的每个元素,returns 为“0”。下一步是使用矩阵索引对 Time 数组进行索引,以获取 Status 处于“开”状态的相应持续时间。从这里可以采用插值来构建状态图,其中“1”表示“ON”,“0”表示“OFF”。使用 interp1() 函数允许为一组新的 points/axis 插入信号。在这种情况下,我们需要在时间戳之间插入所有状态。使用前面的插值方法可以达到预期的效果。得到图表后,可以根据文本文件中的时间戳取 Interpolated_Binary_State 的总和来得到持续时间。


完整脚本:

clear;
clc;

%Reading in the data as a cell array%
fileID = fopen('Text.txt', 'r');

Header = string(fgetl(fileID));
Data = textscan(fileID,'%d %f %s');

fclose(fileID);

%Splitting the data into specific columns%
Time = Data(:,1);
Time = Time{1,1};
Power = Data(:,2); 
Power = Power{1,1};
Status = Data(:,3);
Status = string(Status{1,1});

%Binary state graph%
Binary_State = contains(Status,"on");

%Interpolating the binary state graph for every interval between the
%timestamps%
Interpolated_Time = (0:max(Time));
Interpolated_Binary_State = interp1(double(Time),double(Binary_State),double(Interpolated_Time),'previous');

%Plotting the state graph%
stairs(Interpolated_Time,Interpolated_Binary_State);
title("State Graph ON (1) and OFF (0)");
xlabel("Time"); ylabel("State (ON/OFF)");
ylim([0 1.1]);
xticks(0:max(Time));

Total_On_Time = sum(Interpolated_Binary_State)
   

运行 使用 MATLAB R2019b