我有一个电压数据集(每500毫秒采样一次)。让我们说它看起来像这样(在数组中):
0ms -> 1.4v
500ms -> 1.3v
1000ms -> 1.2v
1500ms -> 1.5v
2000ms -> 1.3v
2500ms -> 1.3v
3000ms -> 1.2v
3500ms -> 1.3v
假设读数之间的转换是线性的(IE:250ms = 1.35v),我将如何计算读数高于或等于1.3v的总时间百分比?
我最初只得到%> = 1.3v的值(IE:样本数组中的6/8),但这只有在点之间的角度为45度时才有效。我假设我必须做一些事情,比如从第1点到第2点创建一条线,并找到基线(1.3v)的截距。然后对点2和点3进行相同的操作,找到两个相交点之间的距离(说700毫秒),然后对所有点重复,得到总采样时间的百分比。
修改
当我最初问起时,也许我不清楚。我需要帮助确定如何执行这些计算,IE:我可以用来帮助我虚拟绘制这些行并执行这些计算的对象/类或可能提供这些功能的任何第三方数学包。
答案 0 :(得分:1)
重要的部分不是在数据点上思考,而是在间隔中思考。每个间隔(例如0-500,500-1000,...)是三种情况之一(从浮点变量above
和below
开始都是0):
below += 1
above += 1
min
和较高的值max
。现在我们执行above += (max-threshold)/(max-min)
和below += (threshold-min)/(max-min)
,因此我们在两个州之间线性分配此间隔。最后,将above
和below
除以间隔数,将结果标准化。这将为您提供一对数字,表示分数,即最多加1个模数舍入误差。当然乘以100会给出百分比。
修改强>
@phoog在评论中指出,我没有提到"等于"案件。这是设计的,因为您的问题已经包含:您选择>=
作为比较,所以我绝对会在这里使用相同的比较。
答案 1 :(得分:1)
如果我已正确理解问题,您可以使用这样的类来保存每个条目:
public class DataEntry
{
public DataEntry(int time, double reading)
{
Time = time;
Reading = reading;
}
public int Time { get; set; }
public double Reading { get; set; }
}
然后使用以下链接语句来获得高于1.3的段:
var entries = new List<DataEntry>()
{
new DataEntry(0, 1.4),
new DataEntry(500, 1.3),
new DataEntry(1000, 1.2),
new DataEntry(1500, 1.5),
new DataEntry(2000, 1.3),
new DataEntry(2500, 1.3),
new DataEntry(3000, 1.2),
new DataEntry(3500, 1.3)
};
double totalTime = entries
.OrderBy(e => e.Time)
.Take(entries.Count - 1)
.Where((t, i) => t.Reading >= 1.3 && entries[i + 1].Reading >= 1.3)
.Sum(t => 500);
var perct = (totalTime / entries.Max(e => e.Time));
这应该会给你500ms以上的段保持在1.3以上。