У меня есть несколько файлов в формате csv с научными данными, чтобы изучить их в 3D. Содержимое файла организовано как дата и время, частота в Гц и интенсивность в дБ, как в этом примере:
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 правильно обрабатывать формат даты и времени первого столбца или мне нужно предварительно обработать файл, чтобы преобразовать его во что-то другое?
Спасибо за вашу поддержку
ОБНОВЛЕНО после ответа со следующим исходным кодом. Я загрузил 3,6 миллиона точек, и трехмерный график отображается плавно. Мне понадобятся некоторые инструкции о том, как раскрасить отдельные точки в зависимости от их значения 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();
}