如何转换成ILArray双[,]数组如何将ILArray转换为double [,]数组?
我ILArray<double> A
想使用A.ToArray()
,但不知道如何使用它
我需要一个double[,] System.Array
。
如何转换成ILArray双[,]数组如何将ILArray转换为double [,]数组?
我ILArray<double> A
想使用A.ToArray()
,但不知道如何使用它
我需要一个double[,] System.Array
。
当前没有将ILArray<double>
转换为ILNumerics中的多维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和其他)更喜欢列主要的顺序!所以,既然我们只是快速复制的元素,并做一切努力来重新排序在内存中,outcoming阵列将显示为相比具有翻转输入数组尺寸:
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(双) @Edit:修正:现在固定的修正:使用Marshal.Sizeof(typeof(T))
Haymo我不能使这个函数工作。 Buffe.BlockCopy行似乎仍然存在错误。 Marshal.SizeOf(T)给出一个构建错误,Marshal.SizeOf(typeof(T))不给出构建错误,但不起作用 – nik
对。我编辑了代码。它读取'Marshal.Sizeof(typeof(T))'。请澄清哪些不起作用?考虑打开一个新的线程。 –
我已经打开了一个新线程 –
nik