#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-массивов, вы ничего не можете сделать.