从文本文件中读取特定数据并计算结果
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
我必须从文本文件中读取数据:
如何找到机器 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