将数组从Matlab Application Server传输到F#

时间:2011-11-17 14:00:11

标签: .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[]

应用向下转换后,数组的类型为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?

1 个答案:

答案 0 :(得分:2)

类型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[][]类型的数组,则可以使用float[,]函数将其转换为array2D。如果数组不是矩形,则函数将失败。