Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2012, 22:34   #1
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
Лампочка c++ умножение разреженных матриц

Здравствуйте уважаемые форумчанины....

Возникла следующая проблема....

есть односвязный список, который хранит номер ячейки, в котором находится не нулевой элемент и само значение:
Код:
template <class T>
struct SparseMatrixStorage
{
        long indexI;
        long indexJ;
        T info;
        SparseMatrixStorage *next;
};
Есть класс SparseMatrix, который работает с данной структурой.
В классе есть метод умножение двух матриц.
Она у меня не работает.. Вылетают разные ошибки....
Не могли бы вы мне помочь написать нормальный метод??????
Код:
template <class T>
class SparseMatrix : BaseMatrix<T>
{
        public:
                SparseMatrix(long lengthI, long lengthJ): BaseMatrix<T>(lengthI, lengthJ, false)
                {
                        head = NULL;
                        count = 0;
                };
                SparseMatrix():BaseMatrix<T>()
                {
                        head = NULL;
                        count = 0;
                };
                void operator = (T ** matrix)
                {
                        SparseMatrixStorage<T> *temp;
                        long dimension = 0;
                        for (long i = 0; i < GetCountI(); i++)
                                for (long j = 0; j < GetCountJ(); j++)
                                {
                                        if (matrix[i][j] != 0)
                                        {
                                                SparseMatrixStorage<T> *elem = new SparseMatrixStorage<T>;
                                                if(GetHead() == NULL)
                                                        SetHead(elem);
                                                else
                                                        SetPrevAddress(elem);
                                                try
                                                {
                                                        elem->info = matrix[i][j];
                                                        elem->indexI = i;
                                                        elem->indexJ = j;
                                                        elem->next = NULL;
                                                        SetPrev(elem);
                                                        dimension ++ ;
                                                        //......
                                                }
                                                catch(...)
                                                {
                                                        ShowMessage("Неправильно заполнена матрица");
                                                        break;
                                                }
                                        }
                                }
                        SetCount(dimension);
                };
world12_tk вне форума Ответить с цитированием
Старый 09.01.2012, 22:36   #2
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
По умолчанию

Код:
      void operator * (T ** matrix)
                {
                        SparseMatrix result;
                        for (long i = 0; i < GetCountI(); i++)
                                for (long j = 0; j < GetCountJ(); j++)
                                {
                                        if (matrix[j][i] != 0)
                                        {
                                                SparseMatrixStorage<T> *elem = new SparseMatrixStorage<T>;
                                                if(head == NULL)
                                                        head = elem;
                                                else
                                                        prev->next = elem;
                                                try
                                                {
                                                        elem->info = matrix[j][i];
                                                        elem->indexI = j;
                                                        elem->indexJ = i;
                                                        elem->next = NULL;
                                                        prev = elem;
                                                        count ++ ;
                                                }
                                                catch(...)
                                                {
                                                        ShowMessage("Неправильно заполнена матрица");
                                                        break;
                                                }
                                        }
                                }
                        SparseMatrixStorage<T> *tempHead = GetHead();
                        SparseMatrixStorage<T> *elem = new SparseMatrixStorage<T>;
 
                        for (long i = 0; i < GetCountJ(); i++)
                        {
                                if (result.head == NULL)
                                        result.head = elem;
                                else
                                        result.prev->next = elem;
                                SparseMatrixStorage<T> *temp = tempHead;
                                SparseMatrixStorage<T> *temp2Head = head;
 
                                if (temp != NULL)
                                {
                                        for (long j = 0; j < GetCountJ(); j++)
                                        {
                                                long number = 0;
                                                SparseMatrixStorage<T> *temp2 = temp2Head;
                                                if (temp2 != NULL)
                                                {
                                                        for (long k = 0; k < GetCountI(); k++)
                                                        {
                                                                if ((temp != NULL) && (temp->indexI == j) && (temp2->indexJ == k))
                                                                {
                                                                        number += temp->info * temp2->info;
                                                                        temp = temp->next;
                                                                        temp2 = temp2->next;
                                                                }
 
                                                        }
                                                        temp2Head = temp2Head->next;
                                                        if (number != 0)
                                                        {
                                                                elem->indexI = i;
                                                                elem->indexJ = j;
                                                                elem->info = number;
                                                                result.prev = elem;
                                                                result.count++;
                                                                SparseMatrixStorage<T> *elem = new SparseMatrixStorage<T>;
                                                        }
                                                }
                                        }
                                        tempHead = tempHead->next;
                                }
 
 
                        }
world12_tk вне форума Ответить с цитированием
Старый 09.01.2012, 22:37   #3
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
По умолчанию

Код:
                      
                        SetHead(result.head);
                        SetPrev(result.prev);
                        DeleteStorage();
                        SetCountI(GetCountJ());
                };
                private:
                void DeleteStorage()
                {
                        while(head != NULL)
                        {
                                SparseMatrixStorage<T> *pTemp = head;
                                head = head->next;
                                delete pTemp;
                        }
                };
                SparseMatrixStorage<T> * head;
                SparseMatrixStorage<T> * prev;
                long count;
};
Вызываю я так:
Код:
        SparseMatrix<long double> sparseMatrix (column,row);
        sparseMatrix = realMatrix;
        sparseMatrix * realMatrix2;
        column = row;
        OutputPrint(column,row,sparseMatrix.Print());
Заранее спасибо.....
world12_tk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Умножение матриц BDA Общие вопросы C/C++ 2 20.11.2011 01:06
Кольцевая КРМ-схема хранения разреженных матриц Tokiya Помощь студентам 0 11.05.2011 04:45
Умножение 2-х матриц Lifefine Общие вопросы Delphi 7 23.03.2011 09:54
умножение матриц Rusya_00 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 06.01.2011 23:51
Произведение разреженных матриц MafoR Помощь студентам 1 24.04.2010 18:37