如何在ILArray中加载大型CSV文件进行3d绘图?

时间:2014-03-19 12:45:50

标签: csv ilnumerics

我有几个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值对各个点着色的说明。 似乎使用具有数百万点输入的表面有点......重:-)我可以使用任何性能提示吗?

这是截图:screenshot of the rendered scene

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();
}

1 个答案:

答案 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 } }); }  enter image description here