Эффективное преобразование NSArray и float *

#objective-c #floating-point #nsarray

#objective-c #с плавающей запятой #nsarray

Вопрос:

Я знаю, что можно конвертировать между float * и NSArray (или NSMutableArray) с помощью

 for (int i=0; i<[array count]; i  ) x[i] = [[array objectAtIndex:i] floatValue];

for (int i=0; i<N; i  ) [array addObject:[NSNumber numberWithFloat:x[i]]];
  

Но оба они используют циклы for, которые являются медленными и неэффективными. Я хотел бы видеть x = [array toFloatArray] . Почти все, что использует изображения / что-либо, связанное с iOS, и требует библиотек более низкого уровня (BLAS, LAPACK и т.д.), Требует этого преобразования, и было бы неплохо ускорить его.

Комментарии:

1. Так вы думаете, x = [array toFloatArray] не будет повторения по массиву? Похоже, вы хотите сэкономить на наборе текста больше всего на свете.

2. Я знаю, что есть преимущества от векторизованного кода (например, BLAS), и я предполагаю, что подобная функция также будет векторизована.

3. Разве «векторизованный код» не является оптимизацией компилятора? Если это так, это не поможет с произвольными массивами, только с закодированными for циклами и т.д.

4. Если это оптимизация компилятора, почему существуют такие библиотеки, как BLAS и LAPACK? Это то, что я пытаюсь эмулировать.

5. Я ничего о них не знаю. Я думаю, лучшее, что вы получите, — это быстрое перечисление .

Ответ №1:

Независимо от того, что вы делаете, или какая библиотека задействована, чтобы получить значения с плавающей запятой из NSNumbers, которые находятся в NSArray, нет способа обойти код, который более или менее похож на то, что вы уже показали.

Если вам нужна скорость, используйте необработанные C-массивы и управляйте ими самостоятельно.

Если используемый вами код предоставляет или требует NSArrays с NSNumbers, содержащими числа с плавающей точкой, вместо необработанных C-массивов, вы ничего не можете сделать.