首页 > 解决方案 > 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

标签: matlabfor-looptext-files

解决方案


方法 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 运行


推荐阅读