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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
#1

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

21.07.2011, 11:08. Просмотров 2386. Ответов 5
Метки нет (Все метки)

Нужен код для перемножения матрицы и столбца за минимально возможное время.
Порядок матрицы ( и столбца ) огромен - около 100000. Помогите найти оптимальный код!
Ищу уже 2 день... что-то безрезультатно как то(((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2011, 11:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перемножение матриц. (C++):

Перемножение матриц - C++
Помогите решить проблему суть задачи проверить матрицу бинарного отношения на свойства. Все сделал кроме Транзитивности, суть того, что...

Перемножение матриц - C++
Народ помогите плиз!!! Не получается перемножить 2 матрици 3х3. Может у кого есть запрограммированый алгоритм? Очень нужно.

Перемножение матриц - C++
Доброго времени суток! У меня есть две матрицы: первая k x m и вторая u x s размерностей. Нужно их перемножить. Подскажите, пожалуйста, в...

Перемножение матриц - C++
Как сделать перегрузку *= для матриц ?! Был такой вариант: Matrix& Matrix::operator *= (const Matrix &rhs) { Matrix...

Перемножение матриц - C++
Привет. Помогите пожалуйста решить нетрудную задачу.Заранее спасибо. (если можно рабочую версию) Дано два двумерных массива ...

Перемножение матриц - C++
Помогите исправить ошибки. //--------------------------------------------------------------------------- #include <iostream> ...

5
Mиxaил
533 / 438 / 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 минуту
матрица хранится в одномерном массиве.
0
Stas0n
3 / 4 / 0
Регистрация: 13.07.2011
Сообщений: 313
21.07.2011, 11:21  [ТС] #3
Вот только там нет определния кучи ф-ций...
0
Mиxaил
533 / 438 / 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;
}
тут, вроде, без сторонних функций
1
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.07.2011, 11:42 #5

Не по теме:

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


а по теме: вам нужно ленточное перемножение матриц
1
asics
Freelance
Эксперт С++
2847 / 1782 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
21.07.2011, 11:49 #6
Вот подобная тема -- Распараллеливание
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2011, 11:49
Привет! Вот еще темы с ответами:

Перемножение матриц - C++
Даны две квадратные матрицы.Напишите программу перемножающую матрицы по правилам перемножения матриц. У меня есть программа. но мне...

Перемножение матриц - C++
Помогите пожалуйста перемножить матрицу а на с и вычесть из этого м-цу б, у меня постоянно нули =/ #include &lt;math.h&gt; #include...

Перемножение 2-х матриц - C++
Написал программу перемножения матриц, не понимаю в чем дело , выводит бред. Подскажите в чем проблема пожалуйста.Размеры матрицы...

Перемножение матриц - C++
Помогите пожалуйста написать программу в которой будет содержаться функция для перемножения двух прямоугольных матриц.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
21.07.2011, 11:49
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru