.net 将阵列从Matlab应用服务器传输到F#

.net 将阵列从Matlab应用服务器传输到F#,.net,matlab,f#,.net,Matlab,F#,我在将多维数组从Matlab应用程序服务器传输到F#脚本会话时遇到问题 #I @"C:\Program Files\MATLAB\R2010a\bin\win64";; #r @"MLApp.dll";; let matlab=new MLApp.MLAppClass();; matlab.Execute("a=[1 2 3 4 5;6 7 8 9 10]");; let b =matlab.GetVariable("a","base");; let arr = b :?> float[]

我在将多维数组从Matlab应用程序服务器传输到F#脚本会话时遇到问题

#I @"C:\Program Files\MATLAB\R2010a\bin\win64";;
#r @"MLApp.dll";;
let matlab=new MLApp.MLAppClass();;
matlab.Execute("a=[1 2 3 4 5;6 7 8 9 10]");;
let b =matlab.GetVariable("a","base");;
let arr = b :?> float[]
应用向下转换后,数组的类型为array2D,float[,]。但是数组是否显示为这样:

arr;;
val it : float [,] = [[1.0; 2.0; 3.0]
                      [4.0; 5.0; 6.0]]
对于矩形阵列,我习惯于得到这样的结果

arr;;
                    = [|[|1.0; 2.0; 3.0|]
                      [|4.0; 5.0; 6.0|]|]

这些类型之间的区别在哪里?为什么我不能对float[,]类型的arr应用数组切片呢?

类型
float[,]
表示二维数组。您可以使用
Array2D
模块中的函数来使用它,并且可以通过指定两个索引(例如
arr.[0,0]
)来访问元素。数组必须是规则的(矩形),因此也可以使用切片,因为矩形中的所有值都已定义

> let arr2d = array2D [ [1 .. 3]; [4 .. 6] ];;
val arr2d : int [,] = [[1; 2; 3]
                       [4; 5; 6]]

> arr2d.[1,1];;
val it : int = 5
在第二种情况下得到的类型
float[][]
是一个一维数组,包含
float
的一维数组。要访问元素,首先需要指定第一个数组的索引,然后在返回的数组中选择一个元素:

> let arrOfArr = [| [| 1 .. 3 |]; [| 0 |] |];;
val arrOfArr : int [] [] = [|[|1; 2; 3|]; [|0|]|]

> arrOfArr.[0].[1];;
val it : int = 2
如本例所示,类型
float[][]
不必表示矩形数组,因为各个数组可能具有不同的长度(即在上述示例中为3和1)。这就是为什么不能使用切片来访问其元素的原因


如果您的数组类型为
float[][]
,则可以使用
array2D
函数将其转换为
float[,]
。如果阵列不是矩形的,函数将失败。

Tomas,真是荣幸!如果我理解正确,数组类型的数组也称为“锯齿数组”?关于切片,如果我尝试执行类似于
arr[0,0..2]
的操作,我会收到错误消息:
此表达式应具有类型“a[],但此处具有类型float[,]
是的,这是正确的。数组的数组也称为“锯齿数组”。关于切片,您始终需要为两个索引指定切片(结果将是一个二维数组,即使您实际上只在其中一个维度中选择了一个元素)。例如:
arr[0..0,0..2]