2016-09-09 2 views
0

Что такое эффективный способ преобразовать массив pixelValues ​​[UInt8] в двухмерном массиве pixelValues ​​строк - [[UInt8]]Как эффективно преобразовать одномерный массив двумерного массива в swift3

+0

Вы хотите добавить массивы в многомерную [[UInt8]] или разделить исходный массив [UInt8] на меньшие массивы, представляющие строки? если да, то каково правило разделить его? – xhamr

+0

@xhamr Я хочу сделать (из массива pixelxValues ​​[UInt8] of Image) двумерный массив, в котором каждый элемент - pixelRow (т. Е. [UInt8]) из массива pixelxValues ​​[UInt8] изображения. – VYT

ответ

1

Вы можете написать что-то вроде этого:

var pixels: [UInt8] = [0,1,2,3, 4,5,6,7, 8,9,10,11, 12,13,14,15] 
let bytesPerRow = 4 
assert(pixels.count % bytesPerRow == 0) 
let pixels2d: [[UInt8]] = stride(from: 0, to: pixels.count, by: bytesPerRow).map { 
    Array(pixels[$0..<$0+bytesPerRow]) 
} 

Но при семантике значений массивов Swift все попытки создания нового вложенного массива требуют копирования содержимого, поэтому для вашей цели не может быть «эффективным».

Пересмотрите, если вам действительно нужен такой вложенный массив.

+0

У меня есть массив pixelValues ​​[UInt8] и попробовал преобразовать его с помощью карты, и в конечном итоге с [ArraySlice ] вместо [[UInt8]]. Имеет ли смысл использовать ArraySlice ? – VYT

+0

'ArraySlice' также является типом значения, но его функция копирования на запись сохранит некоторую стоимость копирования в некоторых случаях, все равно в некоторых других случаях. Зависит от того, как вы используете этот «2d-массив». – OOPer

+0

@ VYT, мне нужно отметить, что индексы 'ArraySlice' не всегда начинаются с 0. Возможно, это не то, что вы хотите. – OOPer

Смежные вопросы