今天我终于没有再当鸽子了.
如何提取运算中的数值信息
这里主要是介绍矩阵存储数据的思想.
先假设一个情形:
我在分析模拟电网波动时,想了解究竟有多少次电频率超过我设置的舒适值,那么我该如何统计超过的次数呢?
首先先放上我对电网频率的模拟代码(使用了自回归模型,随机模型使用的是常用的高斯函数)
(一些参数的设置是通过参考文献算出来的)
参数设置声明:
x的值是横坐标
a的值是电网频率
C用来储存a的值的矩阵
clc;clear all;
x=1:1000;
C=[50];a=50;
for i=1:999
%注意之所以只执行999次是因为在plot中x的量要与C的量相同,而x有1000个,C中原本就有一个
a=6.698+0.866*a+normrnd(0,0.1);
C=[C,a];
end
plot(x,C,'color','k')
hold on;
line([0,1001],[49.9,49.9],'color','R','linestyle','--');
line([0,1001],[50.1,50.1],'color','R','linestyle','--');
xlim([0,1001]);
ylim([49,51]);
xlabel('Sigma=0.1')
效果图
开头的clc是用来清空运行栏的,clear all是用来清空参数的.
(我将能让用户感到频率波动的前提条件设置为波动在49.9-50.1外)
那么我们该如何提取这些不在范围内的值的出现次数呢?
在前文我们提到了变量的可自我迭代性,我们就用一个变量来做文章就行了.
不多bb,直接开始改进.
clc;clear all;
I=0;
x=1:1000;
C=[50];a=50;
for i=1:999
a=6.698+0.866*a+normrnd(0,0.1);
C=[C,a];
if abs(a-50) > 0.1
I = I + 1
end
end
plot(x,C,'color','k')
hold on;
line([0,1001],[49.9,49.9],'color','R','linestyle','--');
line([0,1001],[50.1,50.1],'color','R','linestyle','--');
xlim([0,1001]);
ylim([49,51]);
xlabel('Sigma=0.1')
为了计数,我们设置了变量I,利用I的自我累加来达到计数的目的.
另外,if里面是可以嵌套if的,但是这样的话一旦嵌套多了,就会出现运行效率低下的问题,当然,初学者不需要考虑这个问题.
那么你学会了吗?
这是最基础的数据统计问题,那么,如果我们想要知道究竟是哪几次数据出现了偏离,我们该怎么办?
这时,我们就可以构造一个矩阵来储存这些数据了.
直接给出代码.
clc;clear all;
I=[];
x=1:1000;
C=[50];a=50;
for i=1:999
a=6.698+0.866*a+normrnd(0,0.1);
C=[C,a];
if abs(a-50) > 0.1
I = [I,i]
end
end
plot(x,C,'color','k')
hold on;
line([0,1001],[49.9,49.9],'color','R','linestyle','--');
line([0,1001],[50.1,50.1],'color','R','linestyle','--');
xlim([0,1001]);
ylim([49,51]);
xlabel('Sigma=0.1')
这次我们的I变成了一个矩阵,用来储存数据.
通过if的逻辑判断,我们成功将所有的偏离数据收集起来了.
这也是一道基础问题.
那么,我想了解下每次偏离的时候会连续出现多久,是否可以统计出来呢?
当然可以.
这就需要我们对I的矩阵元素进行判别(连续与非连续)
那么我就用最简单易懂的逻辑为你概述下我们该如何判断
(可以当练手题目试着做做)
附上我的长的过分if都到爆炸的代码
clc;clear all;
C=[ ];a=50;
for i=1:1000
a=6.698+0.866*a+normrnd(0,0.1);
if abs(a-50) >0.1
C=[C,i]
end
end
c=numel(C)
a=0;Q=0;W=0;E=0;R=0;T=0;
for i=2:c
if C(i) - C(i-1) == 1
a = a + 1
else
if a==0
Q=Q+1
end
if a==1
W=W+1
end
if a==2
E=E+1
end
if a==3
R=R+1
end
if a>=4
T=T+1
end
a=0
end
end
几点改变:
1.此处的C储存的值不再是a的值,而是改为储存了i的值,因为我们要算的不是数据的离散程度,而是要储存偏离数据出现时对应的时间段.
2.numel函数是用来计算C的元素个数的,避免出现因为超出C的元素而出现的报错
3.这里设置了几个值用来分别储存连续偏离的时间,一步到位.
4.至于QWERT这五个变量,随便改,开心就好
那么,课后作业来了:
请问我想评估一下用户的满意程度,我该如何评估比较好,并自己写出代码,说服自己.
本题目的背景来源于IMMC冬季赛2019
明天将给出我自己的处理方法喽.
今天就这样吧,我顺便今天把latex语言欠更n个月的文章更新掉算了.