2015-05-29 3 views
0

Я массив поплавкиSwift: Преобразовать массив Float в массив структур

var ar = [Float]() 

for (var i=0; i<900; i++) { 
    ar.append(Float(i)) 
} 

Как я могу преобразовать выше массив в массив структур типа:

struct Vec { 
    var x: Float 
    var y: Float 
    var z: Float 
} 

Без перебора через первый массив?

пример эквивалент в C/C++ может быть что-то вроде этого:

memmove(&vecBuf[0], floatBuf, 900 * sizeof(float)); 
+0

Вы не можете. Так или иначе, вы _must_ итерации через массив, чтобы сделать это. Даже если вы можете использовать 'map' для выполнения преобразования,' map' будет выполнять итерацию. Что у вас есть против итерации? Какая альтернатива: магия? – matt

+0

Кроме того, как бы вы «конвертировали»? Вы хотите, чтобы 'ar [0]' стал первым «x», «ar [1]», чтобы стать первым «y» и т. Д.? Или что? Вы даже не указали _problem_. – matt

+0

Это вполне возможно в C/C++, поэтому мне интересно. В основном это проблема. У меня есть массивы, которые содержат более 600 тыс. Элементов, поэтому требуется много времени для повторения. –

ответ

0

Если вы думаете memmove разумно, то вы, вероятно, предпочитают это очень Swifty путь:

// assume ar is a [Float] variable 
var mem = UnsafeMutablePointer<Float>.alloc(ar.count) 
mem.initializeFrom(ar) 
var mem2 = UnsafeMutablePointer<Vec>(mem) 

В этой версии, мы просто начинаем с версии буфера вашего массива Float и отношении его в виде Массив Vec.

+0

Да! Это работает даже быстрее, чем memmove. Кажется, я не могу заставить его работать с массивами C еще из-за ошибок ввода типов, но это не должно быть сложно. Спасибо Мэтту! BTW: Сроки для memmove составляли 0,32015 с для поплавковых элементов 900 000 и с вышеуказанным решением было 0,00254 сек. –

0

Оказывается, что я могу использовать тетсру/memmove в Swift точно так же, как и в C

struct Vec { 
    var x: Float 
    var y: Float 
    var z: Float 
} 

var ar = [Float]() 

for (var i=0; i<900; i++) { 
    ar.append(Float(i)) 
} 

var res = [Vec](count: 300, repeatedValue:Vec(x: 0, y: 0, z: 0)) 

memmove(&res, ar, sizeof(Float) * ar.count) 

NSLog("%f %f %f \n", res[0].x, res[0].y, res[0].z) 

memmove по сравнению с итерацией большого массива с плавающей точкой, и преобразование в структуры привело к сокращению более чем на 5 секунд (когда длина массива с плавающей точкой составляла ~ 560 000).

+1

Почему это решение? Вы повторяете _twice_. Проводили ли вы какие-то временные тесты? – matt

+1

Что вы имеете в виду, я повторяю дважды? Где? –

+1

Надеюсь, вы не имеете в виду цикл 'for', который создает тестовый массив Float! действительно??По вашему мнению, не было никакого способа сделать это, и вот оно. Единственная строка из вышеупомянутого тестового примера, которую вы должны подчеркнуть, - это memmove (& res, ar, sizeof (Float) * ar.count), который заменяет итерацию массива float и создания структур типа Vec. –

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