У меня есть типичный алгоритм умножения матриц. Я пытаюсь применить и понять развертывание цикла, но у меня возникла проблема с реализацией алгоритма, когда я пытаюсь развернуть k раз, когда k не кратно размеру матрицы. (Вместо этого я получаю очень большие числа). Это означает, что я не понимаю, как обращаться с оставшимися элементами после развертывания. Вот что у меня есть:
void Mult_Matx(unsigned long* a, unsigned long* b, unsigned long*c, long n)
{
long i = 0, j = 0, k = 0;
unsigned long sum, sum1, sum2, sum3, sum4, sum5, sum6, sum7;
for (i = 0; i < n; i++)
{
long in = i * n;
for (j = 0; j < n; j++)
{
sum = sum1 = sum2 = sum3 = sum4 = sum5 = sum6 = sum7 = 0;
for (k = 0; k < n; k += 8)
{
sum = sum + a[in + k] * b[k * n + j];
sum1 = sum1 + a[in + (k + 1)] * b[(k + 1) * n + j];
sum2 = sum2 + a[in + (k + 2)] * b[(k + 2) * n + j];
sum3 = sum3 + a[in + (k + 3)] * b[(k + 3) * n + j];
sum4 = sum4 + a[in + (k + 4)] * b[(k + 4) * n + j];
sum5 = sum5 + a[in + (k + 5)] * b[(k + 5) * n + j];
sum6 = sum6 + a[in + (k + 6)] * b[(k + 6) * n + j];
sum7 = sum7 + a[in + (k + 7)] * b[(k + 7) * n + j];
}
if (n % 8 != 0)
{
for (k = 8 * (n / 8); k < n; k++)
{
sum = sum + a[in + k] * b[k * n + j];
}
}
c[in + j] = sum + sum1 + sum2 + sum3 + sum4 + sum5 + sum6 + sum7;
}
}
}
Допустим, размер n
равен 12. Когда я разворачиваю его 4 раза, этот код работает, то есть когда он никогда не входит в оставшийся цикл. Но я теряю след того, что происходит, когда это происходит! Если кто-нибудь может указать мне, где я ошибаюсь, я был бы очень признателен. Я новичок в этом, и мне трудно понять.
sum1
вsum7
почему бы просто не добавить кsum
? Например,sum += a[in+(k+5)]* b[(k+5)*n+j]
? Или, возможно, тоже пропуститьsum
и добавить непосредственно кc[in + j]
? - person Some programmer dude   schedule 20.11.2017sum3
сводят меня с ума :) - person Steve   schedule 20.11.2017