如何转换ILArray<;对象>;转换为ILArray<;加倍>;

本文关键字:lt gt ILArray 转换 何转换 对象 加倍 | 更新日期: 2023-09-27 18:24:18

我正在使用ILNumerics从matfile读取和向matfile写入。我从数据库中获得一些数据作为对象[,],因为它包含数字和标题(字符串)。

object[,] loaddata的数据结构是System.StringSystem.Double的混合,前两列和第一行包含字符串rest 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函数如何将ILArray转换为双[,]数组?-我做不到。

有什么想法可以简化吗?以及如何使该功能发挥作用(因为它无论如何都是有用的)。

更新

我做了这项工作,但感觉就像是用大锤砸。。。。但它来了:

       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)出现错误。

有什么想法可以让它更整洁吗?

如何转换ILArray<;对象>;转换为ILArray<;加倍>;

考虑重新思考您的设计。为了从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

更改此行:

 var tempoobj = ToSystemMatrix<object>(loaddata["2:end", "1:end"]);

 var tempoobj = ToSystemMatrix<double>(loaddata["2:end", "1:end"]);

这假设您只选择了loaddata的一部分,其中所有数据都是双数据。