int multMatrixSqBad (double * a, const int n, double * b, double * c) {
int i, j, k;
for (i = 0; i <n; i ++) {
for (j = 0; j <n; j ++) {
c [i * n + j] = 0;
for (k = 0; k <n; k ++) {
c [i * n + j] + = a [i * n + k] * b [k * n + j];
}
}
}
return 0;
}
int multMatrixSq (double * a, const int n, double * b, double * c) {
double s1 = 0, s2 = 0, s3 = 0, s4 = 0;
double * f, * g, * h;
int i, j, k;
if (n% 2 == 0) {
for (i = 0; i <n-1; i + = 2)
{
f = a + i * n;
for (j = 0; j <n-1; j + = 2)
{
g = b + j;
for (k = 0; k <n; k ++) {
s1 + = f [k] * g [n * k];
s2 + = f [n + k] * g [n * k];
s3 + = f [k] * g [n * k + 1];
s4 + = f [n + k] * g [n * k + 1];
}
h = c + i * n + j;
h [0] = s1; s1 = 0;
h [n] = s2; s2 = 0;
h [1] = s3; s3 = 0;
h [n + 1] = s4; s4 = 0;
}
}
}
else {
for (i = 0; i <n-1; i + = 2)
{
f = a + i * n;
for (j = 0; j <n-1; j + = 2)
{
g = b + j;
for (k = 0; k <n; k ++) {
s1 + = f [k] * g [n * k];
s2 + = f [n + k] * g [n * k];
s3 + = f [k] * g [n * k + 1];
s4 + = f [n + k] * g [n * k + 1];
}
h = c + i * n + j;
h [0] = s1; s1 = 0;
h [n] = s2; s2 = 0;
h [1] = s3; s3 = 0;
h [n + 1] = s4; s4 = 0;
}
if (j == n-1) {
g = b + j;
for (k = 0; k <n; k ++) {
s1 + = f [k] * g [n * k];
s2 + = f [n + k] * g [n * k];
}
h = c + i * n + j;
h [0] = s1; s1 = 0;
h [n] = s2; s2 = 0;
}
}
if (i == n-1) {
f = a + i * n;
for (j = 0; j <n-1; j + = 2)
{
g = b + j;
for (k = 0; k <n; k ++) {
s1 + = f [k] * g [n * k];
s3 + = f [k] * g [n * k + 1];
}
h = c + i * n + j;
h [0] = s1; s1 = 0;
h [1] = s3; s3 = 0;
}
if (j == n-1) {
g = b + j;
for (k = 0; k <n; k ++) {
s1 + = f [k] * g [n * k];
}
h = c + i * n + j;
h [0] = s1; s1 = 0;
}
}
}
return 0;
}
int multMatrixBlock (double * a, const int n, double * b, const int m, double * res, double * c, double * d, double * e) {
int n_block = n / m;
int m_small;
int i, j, k, o;
m_small = n-n_block * m;
clearMatrix (res, n * n);
for (i = 0; i <= n_block; i ++)
{
for (j = 0; j <= n_block; j ++)
{
for (k = 0; k <= n_block; k ++)
{
if (i <n_block && j <n_block && k <n_block) {
getSubMatrix (a, n, c, m, i, k);
getSubMatrix (b, n, d, m, k, j);
multMatrixSq (c, m, d, e);
setSubMatrixAdded (res, n, e, m, i, j);
}
else if (i <n_block && j <n_block && k == n_block) {
getSubMatrix (a, n, c, m, i, k);
getSubMatrix (b, n, d, m, k, j);
multMatrixRect (c, m, d, m_small, m, e);
setSubMatrixAdded (res, n, e, m, i, j);
}
else if (i == n_block && j <n_block && k <n_block) {
getSubMatrix (a, n, c, m, i, k);
getSubMatrix (b, n, d, m, k, j);
multMatrixRect (c, m_small, d, m, m, e);
setSubMatrixAdded (res, n, e, m, i, j);
}
else if (i == n_block && j <n_block && k == n_block) {
getSubMatrix (a, n, c, m, i, k);
getSubMatrix (b, n, d, m, k, j);
multMatrixRect (c, m_small, d, m_small, m, e);
setSubMatrixAdded (res, n, e, m, i, j);
}
else if (i <n_block && j == n_block && k <n_block) {
getSubMatrix (a, n, c, m, i, k);
getSubMatrix (b, n, d, m, k, j);
multMatrixRect (c, m, d, m, m_small, e);
setSubMatrixAdded (res, n, e, m, i, j);
}
else if (i <n_block && j == n_block && k == n_block) {
getSubMatrix (a, n, c, m, i, k);
getSubMatrix (b, n, d, m, k, j);
multMatrixRect (c, m, d, m_small, m_small, e);
setSubMatrixAdded (res, n, e, m, i, j);
}
else if (i == n_block && j == n_block && k <n_block) {
getSubMatrix (a, n, c, m, i, k);
getSubMatrix (b, n, d, m, k, j);
multMatrixRect (c, m_small, d, m, m_small, e);
setSubMatrixAdded (res, n, e, m, i, j);
}
else if (i == n_block && j == n_block && k == n_block) {
getSubMatrix (a, n, c, m, i, k);
getSubMatrix (b, n, d, m, k, j);
multMatrixSq (c, m_small, d, e);
setSubMatrixAdded (res, n, e, m, i, j);
}
}
}
}
return 0;
}
double formula (int i, int j, int n) {
return 1 / (double (i + j + 1));
}
g ++ matrix_test.cpp -O3


Source: https://habr.com/ru/post/21042/
All Articles