for循环中的错误-Matlab

Errors in 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 循环,并且可以计算当 on 时电源变化了多少次。我对如何计算文本文件中两个连续数据之间的差异有疑问,在本例中是为了计算功率。 最终答案应该是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,因为您将在时间样本之间进行更改,而不是针对每个时间样本进行更改。此外,您需要检查用于评估 difference/change 的两个值是否具有 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()函数

在这里,我使用 contains() 创建了一个表示“ON”和“OFF”状态的数组。该数组在此示例中将被称为 Binary_State,当 machine/device 为“ON”时等于 1,当 machine/device 为“OFF”时等于 NaN ”。设置 NaN(不是数字)项是通过矩阵索引完成的。然后我们可以按元素将 power 乘以 Binary_State 得到一个名为 Power_When_On 的新数组,该数组仅保存与 machine/device 为“ON”时对应的功率值. Power_When_On 数组中的其余值是 NaN(当 machine/device 为“OFF”时)。最后,当machine/device为“ON”/运行时,可以使用diff()函数求出changes/transitions的元素之间的差异。最后一步是找出有多少项大于 1。这可以通过评估 Power_Changes 的绝对值何时大于 1 来完成。函数 nnz() 用于计算有多少个 true 语句(非零的数量)元素。

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

扩展:为了情节和更多见解:

可以绘制“开启”期间时间戳之间的功率变化。

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