Я написал код C, чтобы найти индекс столбца максимального числа (абсолютного максимума) в каждой строке матрицы nxn. Однако есть условие! Если индекс столбца максимального числа в текущей строке совпадает с одним из предыдущих строк, программа должна пропустить этот индекс и найти следующий максимум в этой строке.
Мой код работает нормально, но главное - производительность. К сожалению, мне пока не удалось распараллелить код с использованием OpenMP из-за зависимостей. Я действительно ценю, если вы можете помочь улучшить производительность моего кода. Заранее спасибо.
Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
#include <limits.h>
int main ( unsigned long int argc, char *argv[] )
{
int n = 3;
//double A[9] = {1,2,3,4,5,6,7,8,9}; //output: ind_col[1,..,3] = 2,1,0 max_val[1,..,3] = 3,5,7
double A[9] = {1,3,2,4,6,5,7,8,9}; //output: ind_col[1,..,3] = 1,2,0 max_val[1,..,3] = 3,5,7
/* ind_col is 1xn array that contains the column index of abs. max number for each row */
int *ind_col = NULL;
ind_col = (int*) calloc(n,sizeof(int));
/* max_val is 1xn array that contains the abs. max number for each row */
double *max_val = NULL;
max_val = (double*) calloc(n,sizeof(double));
int i,j,k,rep = 0;
for(i=0; i<n; i++){
for(j=0; j<n; j++) {
if ( (fabs(A[i*n+j]) < max_val[i]) ) continue; // if a new max is found, do...
for(k=0; k<i; k++) if (ind_col[k] == j) rep = 1; // check if the same column index was not previously used
if (rep != 1) { // if this is a new column index save it
max_val[i] = fabs(A[i*n+j]);
ind_col[i] = j;
}
rep = 0;
}
}
for(i=0; i<n; i++) printf("ind_col[%i] = %i , val = %f\n", i, ind_col[i], A[i*n+ind_col[i]]);}
}