matlab - for loop-Matlab 中的错误
问题描述
如何从下面的文本文件中找到电源打开时超过 1W 的功率改变了多少次?
time power status
0 10 on
10 9.9 on
11 9.7 on
12 9 on
13 6 on
14 4 on
15 -1 off
20 10 on
25 9 on
26 5 on
27 4 on
28 -1 off
35 10 on
40 9 on
41 5 on
42 4 on
43 -1 off
我尝试运行一个for循环,并且可以计算出电源打开时改变了多少次。我在计算文本文件中两个连续数据之间的差异时遇到了问题,在这种情况下是为了计算功率。最终答案应该是 4。
fid=fopen('power.txt');
line=fgetl(fid);
data=textscan(fid,'%d %f %s');
fclose(fid);
%data
time=data{1};
power=data{2};
status=data{3};
power_change1=0;
for n=1:length(time)
power_change= abs(power(n)-power(n+1));
if status(n)=="on" && power_change > 1
power_change1=power_change1+1;
end
end
power_change1
解决方案
方法 1:使用 For 循环
for 循环只需要上升,length(time)-1
因为您将在时间样本之间进行更改,而不是针对每个时间样本。此外,您需要检查用于评估差异/变化的两个值是否都有status = "on"
.
fid=fopen('power.txt');
line=fgetl(fid);
data=textscan(fid,'%d %f %s');
fclose(fid);
%data
time=data{1};
power=data{2};
status=data{3};
Power_Change_Counter = 0;
for n=1:length(time)-1
power_change= abs(power(n)-power(n+1));
if status(n) == "on" && status(n+1) == "on" && power_change > 1
Power_Change_Counter = Power_Change_Counter+1;
end
end
Power_Change_Counter
方法二:使用diff()
函数
在这里,我创建了一个表示“ON”和“OFF”状态的数组contains()
。这个数组将Binary_State
在这个例子中被调用并且将等于1
机器/设备是“ON”和NaN
机器/设备是“OFF”的时候。设置NaN
(非数字)项是通过矩阵索引完成的。然后,我们可以将 乘以power
元素Binary_State
,得到一个名为的新数组Power_When_On
,该数组仅保存与机器/设备“开启”时对应的功率值。Power_When_On
数组中的其余值是NaN
(当机器/设备为“OFF”时)。最后,可以通过使用diff()
在机器/设备“开启”/运行时查找更改/转换的功能。最后一步是找出有多少项大于1
。这可以通过评估 的绝对值何时Power_Changes
大于 1 来完成。该函数nnz()
用于计算有多少真实陈述(非零的数量)元素。
fid=fopen('power.txt');
line=fgetl(fid);
data=textscan(fid,'%d %f %s');
fclose(fid);
time = data{1};
power = data{2};
status = data{3};
Binary_State = contains(status,"on")';
Binary_State = double(Binary_State);
Binary_State(Binary_State == 0) = NaN;
Power_When_On = Binary_State.*power.';
Power_Changes = diff(Power_When_On);
Number_Of_Greater_Than_1W_Changes = nnz(abs(Power_Changes) > 1);
Number_Of_Greater_Than_1W_Changes
扩展:对于情节和更多见解:
可以绘制“ON”期间时间戳之间的功率变化。
Mid_Time = zeros(1,length(time)-1);
for Index = 1: length(time)-1
Mid_Time(1,Index) = (double(time(Index)) + double(time(Index + 1)))/2;
end
stairs(Mid_Time,Power_Changes,'-o');
title("Power Changes Between Consecutive Times");
xlabel("Time"); ylabel("Power Change [W]");
xticks(0:max(Mid_Time));
grid;
使用 MATLAB R2019b 运行
推荐阅读
- mysql - 触发 INSERT SQL 多条数据
- google-apps-script - Google 表单响应仪表板
- c# - 对玩家的持续敌人伤害 - Unity 2019.1 Beta
- javascript - MS Teams 应用开发 - 使用 microsoft/teams-js 静默登录 Azure AD
- python - 如何在虚拟环境中升级 pip?
- java - 如何连接到 tcpclient?
- python - 在 R 或 Python 中组合和重塑 2 个数据帧的行和列
- ruby-on-rails - ajax 调用的 ActionController::RoutingError (No route matches [PUT] )
- ruby-on-rails - 我可以强制执行活动记录查询链吗?
- c# - 将 \u2265 插入 C# 字符串