2011-11-17 94 views
1

我有一个将多维数组从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[] 

应用downcast后,数组的类型为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?

回答

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[][]你在第二种情况下得到的是含有1 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[,]。如果数组不是矩形,则该函数将失败。

+0

托马斯,多么荣幸!如果我理解正确,数组类型的数组也被称为“锯齿数组”?关于分割,如果我尝试做类似'arr。[0,0..2]'的操作,我会收到错误消息:'此表达式预计有 'a [] ,但这里的类型为 float [,]' – user1047427

+0

是的,这是正确的。数组的数组也被称为“锯齿状数组”。关于切片,您总是需要为两个索引指定切片(并且结果将是二维数组,即使您实际只选择其中一个维中的一个元素)。例如:'arr。[0..0,0..2]' –

相关问题