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

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

Войти
Регистрация
Восстановить пароль
 
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
#1

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

18.11.2011, 14:20. Просмотров 995. Ответов 4
Метки нет (Все метки)

Есть 2 функции перемножения квадратных матриц N*N
вторая функция транспонирует вторую матрицу для того, чтобы перемножение шло строка на строку, для более эффективного использования кэша, только почему то работает намного медленнее первой, в чем может быть проблема? само транспонирование выполняется мгновенно, проверял на матрицах с размерностью 100-1000 элементов
C++
1
2
3
4
5
6
7
8
9
10
void mul(float* a,float* b,float* c)
{
    for (int i=0;i<N;i++)
            for (int k=0;k<N;k++)
            {
                float val=a[i*N+k];
                for (int j=0;j<N;j++)
                    c[i*N+j]+=val*b[k*N+j];
            }
}


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void transpose(float* A)
{
    for (int i=0;i<N;i++)
        for (int j=i+1;j<N;j++)
                {
                       float t; t=A[i*N+j]; A[i*N+j]=A[j*N+i]; A[j*N+i]=t;
                }
}
void mul_trans(float* a,float* b,float* c)
{
    transpose(b);
    for (int i=0;i<N;i++)
            for (int j=0;j<N;j++)
            {
                float val=0;
                for (int k=0;k<N;k++)
                    val+=a[i*N+k]*b[j*N+k];
                c[i*N+j]=val;
            }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2011, 14:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Умножение матриц (C++):

Умножение треугольных матриц«Методы обработки разреженных матриц» - C++
Нужно перемножить треугольные матрицы в обычном виде и в свёрнутом. С обычным проблем нет. Доступ к элементам свёрнутой матрицы...

Умножение матриц - C++
Форумчане, кто поможет, что здесь не то // Multiplying arrays.cpp : main project file. #include &quot;stdafx.h&quot; ...

Умножение 3 матриц - C++
вод код моей процедуру { GetMatrixA(A); GetMatrixB(B); GetMatrixD(D); for( p= 1; p&lt;=count; p++) for( j= 1; j&lt;=n; j++) { ...

Умножение матриц - C++
complex &lt;double&gt; c; for (int r = 0; r &lt; 4; r++) for (int col = 0; col &lt; 8; col++) for (int i =...

Умножение матриц - C++
Доброго времени суток:) Помогите пожалуйста в написании программы. Пользователь вводит Матрицу А(размер 2х2) и Матрицу В(размер 2х2). ...

Умножение матриц - C++
Вообщем при вводе матриц размером 1х4 или 3х4, получается такое(на картинке), но если вводить матрицы к примеру 4х1 или 4х4, то все окей,...

4
DenCHS200
32 / 32 / 1
Регистрация: 07.10.2011
Сообщений: 117
18.11.2011, 14:41 #2
Можно немного оптимизировать: не обявлять переменную t в цикле, а обьявить до цикла
0
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
18.11.2011, 15:04  [ТС] #3
Цитата Сообщение от DenCHS200 Посмотреть сообщение
Можно немного оптимизировать: не обявлять переменную t в цикле, а обьявить до цикла
это мелочи, транспонирование меньше 1% всего времени занимает
0
DenCHS200
32 / 32 / 1
Регистрация: 07.10.2011
Сообщений: 117
18.11.2011, 15:07 #4
Если ты скорость работы с какой-нибудь готовой функцией сравниваешь, то , скорее всего ,её с помощью ассемблера писали, например в DirectX такие функции есть, так как графика в играх очень часто на матрицах базируется.Может тогда ассемблерную часть кода врезать в листинг?Хотя может и бредовая это идея моя?
0
eXXXXXXXXXXX
30 / 30 / 3
Регистрация: 24.02.2011
Сообщений: 126
18.11.2011, 15:10  [ТС] #5
Цитата Сообщение от DenCHS200 Посмотреть сообщение
Если ты скорость работы с какой-нибудь готовой функцией сравниваешь, то , скорее всего ,её с помощью ассемблера писали, например в DirectX такие функции есть, так как графика в играх очень часто на матрицах базируется.Может тогда ассемблерную часть кода врезать в листинг?Хотя может и бредовая это идея моя?
я привел листинги двух функций, первая 3 обычных вложенных циклов, только с правильным порядком переменных(чтобы осуществлялся проход по строке, а не по столбцу для второй матрицы), во втором листинге осуществляется проход по строкам сразу двух матриц , т.к. 2-ая матрица транспонированная, что должно работать быстрее первого варианта, но работает медленнее, я хочу понять почему
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2011, 15:10
Привет! Вот еще темы с ответами:

Умножение матриц - C++
Решенная задача на умножение матриц для сборника. Матрицы вводятся с клавиатуры построчно. #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

Умножение матриц - C++
Решил немного вспомнить матрицы // Перемножение двух матриц минора. cout&lt;&lt;&quot;Сейчас мы перемножим матрицы.\n\n&quot;; ...

Умножение матриц - C++
Как мне перемножить матрицы друг на друга? Искал в интернете все говорят воспользуйся boost, я скачал, а что делать дальше не понимаю....

Умножение матриц - C++
Я юзаю Qt, но пишу сюда т.к. он никак не влияет на код (почти) У меня есть две матрицы A и B (размерность обеих 800х800). Чтобы получить...


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
18.11.2011, 15:10
Ответ Создать тему
Опции темы

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