Перенос массивов с сервера приложений Matlab на F # - PullRequest
1 голос
/ 17 ноября 2011

У меня проблема с переносом многомерных массивов с сервера приложений 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|]|]

В чем разница между этими типами?И почему я не могу применить нарезку массива к arr типа float [,]?

1 Ответ

2 голосов
/ 17 ноября 2011

Тип 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. Функция не будет работать, если массив не прямоугольный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...