Вы не можете назначить массив.Вы должны посмотреть на разницу между массивами и указателями в C.
То, что вам нужно в вашем коде, выглядит примерно так:
double (*J)[151] = data->J;
, который является указателем на массивы длины 151
.Или, если вы хотите использовать typedefs
typedef double line[151];
line *J = data->J;
, вот и все, вам не следует копировать данные, а просто указатель на данные.
Редактировать: Но видяя думаю, что все это - чистые предположения о том, где может быть ваше узкое место.Это может быть просто где угодно, например, что вы обращаетесь к матрице «неправильно», по столбцам или как угодно.Или то, что выкачка данных из памяти просто доминирует в ваших вычислениях.
Возможно, стоит взглянуть на ассемблер, который создает ваш компилятор (опция -S), чтобы увидеть, есть ли что-то подозрительное.