如何将 ILArray 转换为双 [,] 数组
本文关键字:数组 ILArray 转换 | 更新日期: 2023-09-27 18:36:55
如何将 ILArray 转换为 double[,] 数组
我ILArray<double> A
想使用A.ToArray()
,但不知道如何使用它
我需要得到一个double[,] System.Array
.
目前在
ILNumerics 中没有将ILArray<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:错误修复:现已修复修复:使用元帅大小(类型(T))