我有这个数组:
const / var
_Data : array [0..4] of array [0..3] of Double =
((0,0,0,0),
(0,0,1,1),
(1,0,1,0),
(1,1,0,0),
(1,1,1,1));
我想将其作为此过程的参数值传递:
procedure NN.NetTraining(Data: TDoubleMatrix);
地点:
TDoubleArray = array of Double;
TDoubleMatrix = array of TDoubleArray;
是否有某种方式可以在 Delphi (2009) 中将此静态数组强制转换或转换为动态数组?
提前致谢。
虽然这并不完全符合您的要求(由于 Gamecat 的答案中给出的原因),但它可能是您初始化动态数据数组的可行解决方法:
var Data:TDoubleMatrix;
begin
Data:=TDoubleMatrix.create(TDoubleArray.create(0,0,0,0),
TDoubleArray.create(0,0,1,1),
TDoubleArray.create(1,0,1,0),
TDoubleArray.create(1,1,0,0),
TDoubleArray.create(1,1,1,1));
end;
动态数组与普通数组不同。
动态数组是指针,而普通数组是内存块。对于一维数组,您可以使用数组的地址。但对于多维数组,这个技巧不起作用。
在您的情况下,我将使用一个文件来初始化数组。因此您可以 100% 地使用动态数组。否则你必须编写自己的转换,这违背了动态数组的目的。
您无法投射,但可以复制!类似...
procedure CopyDMatrix(var Source; LengthX, LengthY: integer; var Dest: TDoubleMatrix);
const
SizeOfDouble = SizeOf(Double);
var
n : integer;
ptr: pointer;
begin
SetLength(Dest, LengthX);
Ptr := @Source;
for n := 0 to LengthX - 1 do begin
SetLength(Dest[n], LengthY);
Move(ptr^, Dest[n][0] , SizeOfDouble * LengthY);
inc(cardinal(ptr), SizeOfDouble * LengthY);
end;
end;
//...
CopyDMatrix(Data, Length(Data), Length(Data[0]), DoubleMatrix);
也许你应该使用开放数组来代替?