Форум программистов, компьютерный форум CyberForum.ru

Перемножение матриц. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
21.07.2011, 11:08     Перемножение матриц. #1
Нужен код для перемножения матрицы и столбца за минимально возможное время.
Порядок матрицы ( и столбца ) огромен - около 100000. Помогите найти оптимальный код!
Ищу уже 2 день... что-то безрезультатно как то(((
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2011, 11:08     Перемножение матриц.
Посмотрите здесь:

C++ перемножение матриц
C++ Перемножение матриц
Перемножение 2-ух матриц C++
C++ Перемножение матриц
C++ Перемножение матриц на С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mиxaил
 Аватар для Mиxaил
530 / 435 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
21.07.2011, 11:16     Перемножение матриц. #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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;
}
нашел в интернете

Добавлено через 1 минуту
матрица хранится в одномерном массиве.
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
21.07.2011, 11:21  [ТС]     Перемножение матриц. #3
Вот только там нет определния кучи ф-ций...
Mиxaил
 Аватар для Mиxaил
530 / 435 / 37
Регистрация: 10.12.2009
Сообщений: 1,857
21.07.2011, 11:38     Перемножение матриц. #4
Цитата Сообщение от hello19 Посмотреть сообщение
Вот только там нет определния кучи ф-ций...
исходые функции не удалось найти, сорри... Зато есть еще вот это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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;
}
тут, вроде, без сторонних функций
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.07.2011, 11:42     Перемножение матриц. #5

Не по теме:

Цитата Сообщение от hello19 Посмотреть сообщение
около 100000
лол) я представляю сколько веремени будут перемножаться такие матрицы кодом приведеным выше, а ТС рекомендую смирится с этим заданием, к сожалению это не студенческая задача


а по теме: вам нужно ленточное перемножение матриц
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
21.07.2011, 11:49     Перемножение матриц. #6
Вот подобная тема -- Распараллеливание
Yandex
Объявления
21.07.2011, 11:49     Перемножение матриц.
Ответ Создать тему
Опции темы

Текущее время: 15:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru