Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 11.12.2018
Сообщений: 32
1

Оптимизация произведения матриц через указатели. Как избавится от счетчиков?

23.12.2019, 21:00. Показов 338. Ответов 0

Author24 — интернет-сервис помощи студентам
Разрабатываю оператор для класса матриц, позволяющий умножать матрицы друг на друга. Есть рабочий вариант, однако преподаватель попросил убрать в нем счетчики в циклах и использовать для этого сами указатели. Однако как это реализовать идей уже нет.
Информация об операторе:
Кликните здесь для просмотра всего текста
В классе имеется информация о количестве строк и столбцов матрицы:
C++
1
unsigned int rows, cols;
И указатель на первый элемент матрицы:
C++
1
double* elems;
Метод возвращающий указатель на первый элемент указанной в аргументе строки:
C++
1
double* RowPtr(unsigned row = 1);
Сам оператор умножения:
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
Matrix operator*(const Matrix &B) const //произведение двух матриц (ЛОГИНОВ)
    {
        if (elems == NULL && B.elems == NULL) //предпроверки на пустую матрицу, сравнение строк и столбцов
        {
            EC = 1;
            return Matrix();
        }
        if (cols != B.rows)
        {
            EC = 7;
            return Matrix();
        }
        Matrix C = Matrix(rows, B.cols); //создаем матрицу для записи результатов
        double* colsA = elems; double* rowsA = elems; double* ptrC = C.elems;
        double* colsB = B.elems; double* rowsB = B.elems;
    
        for (unsigned j = 1; j <= rows; j++)
        {
            rowsA = RowPtr(j); colsB = B.elems;
                for (unsigned i = 1; i <= B.cols; i++, ptrC++, colsB++)
                {
                    colsA = rowsA; rowsB = colsB;
                    for (unsigned m = 1; m <= cols; m++, colsA++, rowsB = B.RowPtr(m) + (i - 1))
                        *ptrC += *colsA*(*rowsB);
                }
        }
        return C;
    }


Собственно, как избавиться от j,i,m не потеряв работоспособность не понимаю. Т.к. счетчики увеличиваются на единицу так же как и указатели, пробовал условия цикла ставить через указатели, например внутренний цикл с m:
C++
1
2
3
4
5
6
for (unsigned i = 1; i <= B.cols; i++, ptrC++, colsB++)
                {
                    colsA = rowsA; rowsB = colsB;
                    for (; colsA <=elems + cols;colsA++, rowsB = B.RowPtr(m) + (i - 1))
                        *ptrC += *colsA*(*rowsB);
                }
Первую строку умножает, естественно отлично, но на второй сразу выходит из цикла, т.к. номер первого элемента второй строки уже сразу за границами elems+cols (т.е. последнего элемента первой строки). Получается нужно условие делать каким то динамическим для каждой строки, только как?!!
P.S. Надеюсь раздел выбрал нужный, заранее извиняюсь за возможную ошибку.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2019, 21:00
Ответы с готовыми решениями:

Используя функцию произведения двух матриц, найдите произведение трех матриц А(3,4) В(4,3) С(3,3)
Используя функцию произведения двух матриц, найдите произведение трех матриц А(3,4) В(4,3) С(3,3).

В компонент Label вывести надпись «произведение показаний» и добавить текущее значение произведения показаний счетчиков
Разместите на форме два компонента Edit и два компонента UpDown. Первый счетчик должен отображать...

Оптимизация матричного произведения
Здравствуйте. Подскажите, пожалуйста, как оптимизировать быстродействие следующей функции....

Через указатели на указатели посчитать сумму двух чисел и записать в третье
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать...

0
23.12.2019, 21:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2019, 21:00
Помогаю со студенческими работами здесь

Написать программу сортировки через указатели на указатели
Вот моя программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru