我使用ILNumerics来读取/写入matfiles。我从数据库中获取一些数据作为对象[,],因为它包含数字和标题(字符串)。
object[,] loaddata
的数据结构是System.String
和System.Double
的混合,前两列,第一行包含其余字符串。我想把双打写入matfile。尺寸大致为loaddata[9000,500]
。
这是我通过系统阵列非常麻烦的绕道,甚至不起作用:
ILArray<object> loaddata = DBQuery(....);
//this next line has error
var tempoobj = ToSystemMatrix<object>(loaddata["2:end", "1:end"]);
double[,] tempdouble = new double[500, 8784];
Array.Copy(tempoobj, tempdouble, tempoobj.Length);
ILArray<double> B = tempdouble;
using (ILMatFile matW = new ILMatFile())
{
B.Name = "power";
matW.AddArray(B);
matW.Write(@"C:\Temp\Test.mat");
}
使用ToSystemMatrix函数How to convert ILArray into double[,] array? - 我无法工作。
任何想法如何简化这个?以及如何使该功能发挥作用(因为它无论如何都是有用的)。
更新
我做了这个工作,但感觉就像用大锤去做......但是它来了:
object[,] loaddata = DBQuery(...);
for (int i = 0; i < loaddata.GetLength(0); i++)
{
loaddata[i, 0] = Convert.ToDouble(0);
loaddata[i, 1] = Convert.ToDouble(0);
}
for (int i = 0; i < loaddata.GetLength(1); i++)
{
loaddata[0, i] = Convert.ToDouble(0);
}
double[,] tempdouble = new double[loaddata.GetLength(0), loaddata.GetLength(1)];
Array.Copy(loaddata, tempdouble, loaddata.Length);
ILArray<double> B = tempdouble;
using (ILMatFile matW = new ILMatFile())
{
B.Name = "power";
matW.AddArray(B["1:end","2:end"].T);
matW.Write(@"C:\Temp\Test.mat");
}
我也尝试使用ILCell,但ILCell loaddata = DBQuery(...)
和cell(loaddata)
引发了错误。
任何想法如何让它更整洁?
答案 0 :(得分:1)
更改此行:
var tempoobj = ToSystemMatrix<object>(loaddata["2:end", "1:end"]);
到
var tempoobj = ToSystemMatrix<double>(loaddata["2:end", "1:end"]);
这假设您只选择了所有数据都是双倍的加载数据部分。
答案 1 :(得分:1)
考虑重新考虑您的设计。为了从DBQuery(....)
返回多个信息,您可以使用ILCell
或其他一些能够存储有关标题和元素的类型信息的数据结构(比方说DataTable)。只是对象[,]似乎太笼统了。
由于我没有关于您的设置的具体信息,我将举一个ILCell
示例:
using ILNumerics;
using System;
namespace Cell_DBQuery_Example {
class Program {
static void Main(string[] args) {
using (ILScope.Enter()) {
ILCell data = Helper.DBQuery();
// data is:
//Cell [2,2]
//[0]: <String> header 1 <Double> [100,200]
//[1]: <String> header 2 <Single> [2,3000]
// store into mat file
ILMatFile mat = new ILMatFile();
var key1 = (string)data.GetArray<string>(0, 0);
mat.AddArray(data.GetArray<double>(0, 1), key1); // stores rand(100,200) as key: "header1"
// proceed with other columns...
// write mat file
mat.Write("filename");
}
}
class Helper : ILMath {
public static ILRetCell DBQuery() {
using (ILScope.Enter()) {
// prepare return cell
ILCell ret = cell(size(2, 2));
// todo: fetch data from db and replace below example data
ret[0, 0] = "header_1";
ret[1, 0] = "header_2";
ret[0, 1] = rand(100, 200);
ret[1, 1] = ones<float>(2, 3000);
return ret;
}
}
}
}
}
这将创建并返回Helper
类中的单元格。单元格包含单独单元格元素中的标题和数字数据。它用于从单元格中检索信息并将它们存储到mat文件中。
一些参考文献: http://ilnumerics.net/Cells.html
http://ilnumerics.net/GeneralRules.html - ILNumerics函数的一般规则
http://ilnumerics.net/hdf5-interface.html - 编写兼容格式的更多选项:HDF5