3

如何将 ILArray 转换为 double[,] 数组

一直ILArray<double> A想用A.ToArray(),不知道怎么用

我需要得到一个double[,] System.Array.

4

1 回答 1

3

目前在 ILNumerics中没有自然支持将 aILArray<double>转换为多维。System.Array double[,]所以让我们写吧!

private static System.Array ToSystemMatrix<T>(ILInArray<T> A) {
    using (ILScope.Enter(A)) {
        // some error checking (to be improved...)
        if (object.Equals(A, null)) throw new ArgumentException("A may not be null");
        if (!A.IsMatrix) throw new ArgumentException("Matrix expected");

        // create return array
        System.Array ret = Array.CreateInstance(typeof(T), A.S.ToIntArray().Reverse().ToArray());
        // fetch underlying system array
        T[] workArr = A.GetArrayForRead();
        // copy memory block 
        Buffer.BlockCopy(workArr, 0, ret, 0, Marshal.SizeOf(typeof(T)) * A.S.NumberOfElements);
        return ret;
    }
}

此功能应适用于ILArray<T>任意元素类型和任意大小/尺寸。(但是,与往常一样,您应该在投入生产之前进行广泛的测试!)它会创建一个具有所需大小和类型的新 System.Array,并按照其自然(存储布局)顺序复制所有元素。之后返回的 System.Array 可以转换为真正的多维数组。

我们使用Buffer.BlockCopy为了复制元素。请记住,System.Array 以行主要顺序存储其元素。ILNumerics(就像 FORTRAN、Matlab 等)更喜欢列主顺序!因此,由于我们只是快速复制元素并且没有努力在内存中重新排序它们,因此与输入数组相比,输出数组将显示为具有翻转的维度:

ILArray<double> C = ILMath.counter(4, 3);
var exp = ToSystemMatrix<double>(C); 

exp大小为 [3 x 4]。对于矩阵,这可以很容易地通过转置输入数组来规避:

var exp = ToSystemMatrix<double>(C.T); 

@Edit:错误修复:使用 Marshal.Sizeof(T) 而不是 sizeof(double) @Edit:错误修复:现在修复了修复:使用 Marshal.Sizeof(typeof(T))

于 2013-10-28T14:00:51.610 回答