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
如何从下面的文本文件中找到电源 开启 时功率变化超过 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