【问题标题】:How to convert ILArray<object> into ILArray<double>?如何将 ILArray<object> 转换为 ILArray<double>?
【发布时间】:2014-09-26 20:22:50
【问题描述】:

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

object[,] loaddata 的数据结构是System.StringSystem.Double 的混合,前两列和第一行包含字符串rest doubles。我想将双打写入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) 抛出错误。

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

【问题讨论】:

  • 您能否举例说明您的ILArray&lt;object&gt; 数据的结构?
  • 请看第二段有问题
  • 我对 ILNumerics 的工作原理了解有限,您的数组中的对象类型是什么? IE。你能显示loaddata.First().GetType()的输出吗?
  • @decPL:对不起,也许我不明白,但我确实运行了你所说的以及 loaddata.Last().GetType() 并且如第二段所述,基础类型是 System.String 和 System 。双倍的。或者你是什么意思?抱歉,我仍然是一名学习者,不胜感激!
  • 别担心,我们每天都在学习(我现在似乎正在学习 ILNumerics ;))。基本上我需要知道 - 你如何将ILArray&lt;object&gt; 中的单个条目翻译成双精度。如果你知道如何做到这一点,那么为整个系列做这件事似乎很简单(是的,我愿意分享:P)。

标签: c# ilnumerics


【解决方案1】:

考虑重新考虑您的设计。为了从DBQuery(....) 返回多个信息,您可以使用ILCell 或其他能够存储有关您的标题和元素的类型信息的数据结构(比如说DataTable)。只是 object[,] 似乎太笼统了。

由于我没有关于您的设置的具体信息,我将举一个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

【讨论】:

    【解决方案2】:

    改变这一行:

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

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

    这假设您只选择了所有数据都是双精度的 loaddata 部分。

    【讨论】:

    • 您对泛型类型(而不是对象)使用双精度的更正是正确的。但是给定链接中的 ToSystemMatrix 使用 Buffer.BlockCopy。我希望ILArray&lt;object&gt; 中的元素是 boxed double 元素。一个简单的字节副本不会拆箱吗?
    • 感谢您的回答,但这不起作用,因为该函数需要双倍并且我不会在任何地方拆箱。错误:“ReadMatFileIL.Program.ToSystemMatrix(ILNumerics.ILInArray)”的最佳重载方法匹配有一些无效参数
    猜你喜欢
    • 2013-11-05
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 2013-04-15
    • 2010-11-09
    • 1970-01-01
    相关资源
    最近更新 更多