F # как добавить / объединить array2D и объединить 1D массивы в array2D - PullRequest
6 голосов
/ 03 марта 2010

в F #, array.append может объединять два массива; Есть ли способ добавить 2 объекта array2D в один или по столбцам объединить несколько 1-D массивов в один объект array2D?

Ответы [ 3 ]

6 голосов
/ 03 марта 2010

Функция array2D превратит любой seq<#seq<'T>> в 'T [,], поэтому он должен работать для преобразования набора 1D-массивов в 2D-массив.

let arr1 = [| 1; 2; 3 |]
let arr2 = [| 4; 5; 6 |]

let combined = array2D [| arr1; arr2 |]
3 голосов
/ 03 марта 2010

Насколько я вижу, нет функции библиотеки F #, которая превратила бы несколько одномерных массивов в один 2D-массив, но вы можете написать свою собственную функцию, используя Array2D.init:

let joinInto2D (arrays:_[][]) = 
  Array2D.init arrays.Length (arrays.[0].Length) (fun i j ->
    arrays.[i].[j])

Требуется массив массивов, поэтому, когда вы вызываете его, вы передаете ему массив, содержащий все массивы, которые вы хотите объединить (например, [| arr1; arr2 |] для объединения двух массивов). Функция объединяет несколько одномерных массивов в один двумерный массив, который содержит одну строку для каждого входного массива. Предполагается, что длина всех указанных массивов одинакова (может быть хорошей идеей добавить проверку, чтобы проверить это, например, используя Array.forall). Функция init создает массив указанных измерений, а затем вызывает нашу лямбда-функцию для вычисления значения для каждого элемента - в лямбда-функции мы используем строку как индекс в массиве массивов, а столбец - как индекс в индивидуальный массив.

Вот пример, показывающий, как использовать функцию:

> let arr1 = [| 1; 2; 3 |]
  let arr2 = [| 4; 5; 6 |];;

> joinInto2D [| arr1; arr2 |];;
val it : int [,] = [[1; 2; 3]
                    [4; 5; 6]]

РЕДАКТИРОВАТЬ: Уже есть функция для этого - приятно! Я оставлю здесь ответ, потому что он все еще может быть полезен, например, если вы хотите объединить одномерные массивы в виде столбцов (вместо строк, что является поведением, реализованным array2D.

0 голосов
/ 03 марта 2010

Я не думаю, что есть что-то встроенное, чтобы справиться с этим. Вы можете определить свой собственный метод многократного использования на основе либо Array2D.init, либо Array2D.blit. Если вам нужно объединить несколько столбцов в одно логическое целое, я думаю, что часто было бы удобнее использовать массив массивов, а не двумерный массив (и, как правило, операции с одномерным массивом в .NET выполняются значительно быстрее, чем много операции размерного массива).

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