我有几个csv格式的文件和科学数据,用于检查以3D形式绘制它们。 文件内容按日期时间,频率以Hz为单位,强度以dB为单位,如下例所示:
2014-03-15 18:00:00, 19700000.0, -30.19
2014-03-15 18:00:00, 19700781.25, -31.19
2014-03-15 18:00:00, 19701562.5, -30.43
2014-03-15 18:00:00, 19702343.75, -30.37
2014-03-15 18:00:00, 19703125.0, -27.06
对于绘图上下文,3个值分别代表x,y,z。
我想创建一个名为 datasample 的自定义类型,其中包含 datetime,float,float 类型和然后将数组声明为
ILArray<datasample>
是否有特定的功能或建议的加载文件ILArray用于绘图?
ILNumerics能否正确处理第一列的日期时间格式,还是让我对文件进行预处理以将其转换为其他内容?
感谢您的支持
使用以下源代码的答案后更新 我用这个加载了 360万点,并且3d图得以顺利渲染。 我需要一些关于如何根据Z值对各个点着色的说明。 似乎使用具有数百万点输入的表面有点......重:-)我可以使用任何性能提示吗?
这是截图:
using ILNumerics;
using ILNumerics.Drawing;
using ILNumerics.Drawing.Plotting;
using System.IO;
using System.Globalization;
private void ilPanel1_Load(object sender, EventArgs e)
{
fsin = new System.IO.StreamReader("testlong.iln");
while(fsin.EndOfStream == false)
{
datarow = fsin.ReadLine();
// Console.WriteLine(datarow);
rowvalues = datarow.Split(',');
inrows = inrows + 1;
tempX.Add(float.Parse(rowvalues[0], CultureInfo.InvariantCulture));
tempY.Add(float.Parse(rowvalues[1], CultureInfo.InvariantCulture));
tempZ.Add(float.Parse(rowvalues[2], CultureInfo.InvariantCulture));
}
fsin.Close();
// now that I know the input size (number of x,y,z tuples), I can
// create and initialize the ILArray :
ILArray<float> datasamples = ILMath.zeros<float>(3, (int)inrows );
label1.Text = String.Format("Data points read: {0:N0}", inrows);
// ... and now I can copy data from the input arrays:
datasamples["0;:"] = tempX.ToArray();
datasamples["1;:"] = tempY.ToArray();
datasamples["2;:"] = tempZ.ToArray();
// these are no longer used so...
tempX.Clear();
tempY.Clear();
tempZ.Clear();
var scene = new ILScene {
new ILPlotCube(twoDMode: false) {
new ILPoints {
Positions = datasamples,
Color = Color.Blue,
// Colors =
Size = 0.5F
}
}
};
// at the end of all modifications, call Configure()
ilPanel1.Scene = scene;
ilPanel1.Scene.Configure();
ilPanel1.Refresh();
}
答案 0 :(得分:3)
使用ILMath.csvread<T>()
读取CSV数据。该函数允许通过通用参数指定整体元素类型:
string s =
@"2014-03-15 18:00:00, 19700000.0, -30.19
2014-03-15 18:00:00, 19700781.25, -31.19
2014-03-15 18:00:00, 19701562.5, -30.43
2014-03-15 18:00:00, 19702343.75, -30.37
2014-03-15 18:00:00, 19703125.0, -27.06";
ILArray<double> A = ILMath.csvread<double>(s);
>A
<Double> [5,3]
(:,:) 1e+007 *
0,00000 1,97000 0,00000
0,00000 1,97008 0,00000
0,00000 1,97016 0,00000
0,00000 1,97023 0,00000
0,00000 1,97031 0,00000
目前没有单独的列格式规范。因此,为了包含日期(DateTime),您必须创建自己的数据类型 - 正如您所指出的那样。
然而,这引入了其他问题:
1)csvread()期望来自csv文件的同类元素。虽然ILArray<datasample>
很好(并且很有用),但csvread不直接支持。
2)如果您的目标是绘制数据,则无论如何都必须将日期时间转换为某个实数。 Drawing命名空间只需要ILArray。
3)此外,大多数ILMath函数专用于某些真实(System.Value)元素格式的ILArray。拥有ILArray将通过这些功能带来非常有限的支持。
编辑:这个怎么样? :)强>
private void ilPanel1_Load(object sender, EventArgs e) {
ILArray<float> A = ILMath.tosingle(ILMath.rand(4, 3000));
ilPanel1.Scene.Add(
new ILPlotCube(twoDMode:false) {
new ILPoints() {
Positions = A["0,1,2;:"],
Colors = new ILColormap(Colormaps.Jet).Map(A["2;:"]).T,
Color = null
}
});
}