2

У меня есть 2 двумерных NSMutableArrays, и я пытаюсь сделать некоторое базовое умножение матрицы. У меня есть общий код формулы ниже, но его производительность исключительно медленная (как и ожидалось). Я сделал много поисковых запросов и не нашел простых и понятных формул для изменения кода для повышения производительности. Может кто-нибудь мне точку в правильном направлении простой формулы/учебник/пример того, как получить лучшую производительность, чем 0 (п^3) с матричным умножением в Objective C.Цель C - Матричное умножение Медленная производительность

+ (NSMutableArray*)multiply:(NSMutableArray*)a1 withArray:(NSMutableArray*)a2 
{ 
    if([[a1 objectAtIndex: 0] count] != [a2 count]) 
    { 
     NSLog(@"Multiplicaton error!"); 
     return NULL; 
    } 

    int a1_rowNum = [a1 count]; 
    int a2_rowNum = [a2 count]; 
    int a2_colNum = [[a2 objectAtIndex:0] count]; 
    NSMutableArray *result = [NSMutableArray arrayWithCapacity:a1_rowNum]; 
    for (int i = 0; i < a1_rowNum; i++) { 
     NSMutableArray *tempRow = [NSMutableArray arrayWithCapacity:a2_colNum]; 
     for (int j = 0; j < a2_colNum; j++) { 
      double tempTotal = 0; 
      for (int k = 0; k < a2_rowNum; k++) { 
       double temp1 = [[[a1 objectAtIndex:i] objectAtIndex:k] doubleValue]; 
       double temp2 = [[[a2 objectAtIndex:k] objectAtIndex:j] doubleValue]; 
       tempTotal += temp1 * temp2; 
      } 
      //Stored as a string because I upload it to an online database for storage. 
      [tempRow addObject:[NSString stringWithFormat:@"%f",tempTotal]]; 
     } 
     [result addObject:tempRow]; 
    } 
    return result; 
} 
+0

Проверили вы ли версия C работать лучше? И насколько большими (размерностью) являются 2 матрицы? – nhahtdh

+0

Массивы находятся вокруг 50-200 на 50-200. – MrHappyAsthma

ответ

8

Это будет гораздо быстрее, если вы Запишите его на C.


double[] будет смешно быстро по сравнению с NSArray из NSNumber с для этой задачи. у вас будет хорошая согласованность кеша, минимальные инструкции, нет необходимости проходить через среду выполнения или выделять, чтобы писать или читать элемент. нет необходимости выполнять подсчет ссылок на велосипеде по каждому элементу ...

+0

Есть ли простой способ написать это в C? Моя проблема в том, что я знаю только Java, кроме того, что просто занимаюсь объективным C, и я не мог найти способ передать double [] [] в качестве параметра «сообщение» методу. – MrHappyAsthma

+0

Вы можете написать код C в программах Obj-C ... – aqua

+0

@MrHappyAsthma В этом случае вы можете подумать о создании класса objc для хранения ваших многомерных массивов. Конечно, вы бы хотели избежать обмена сообщениями objc для любого/каждого чтения/записи в этот массив. Кроме того, 'double' потенциально больше точности, чем вам нужно - рассмотрите' float'. Вы также можете поместить его в структуру, если вам не нужен подсчет ссылок. – justin

4

Вы должны взглянуть на компании Apple Ускорить Рамочные для iOS4.0 года. Вы можете сделать много сложных математических и матричных манипуляций с ним, и эта инфраструктура оптимизирована для работы на любом оборудовании iOS.

заказ:

https://developer.apple.com/performance/accelerateframework.html

+2

В частности, функция 'cblas_dgemm' выглядит так, как вы ищите. Или 'cblas_sgemm', если вам нужна только точная точность. –

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