Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Инвертирование матрици в Visual C++ 2008


Автор: malyshkin 24.3.2010, 21:57
Здравствуйте

Я работаю над проектом в Visual C++ 2008, переделывая код в add-on'ы для EXCEL (с помощью xlwVisio). То бишь програмирование без main!

Вопрос такой кто нибудь может помочь с кодом инвертирования матрици? 



Заранее спасибо!


Пример кода складывания двух матриц:

Код

MyMatrix
AddMatrix (const MyMatrix MatrixA, 
           const MyMatrix Design)

{
    if (MatrixA.rows() !=Design.rows())
        throw ("Matricer skal have det samme antal rækker!");
    if (MatrixA.columns() !=Design.columns())
        throw ("Matricer skal have det samme antal kollonner!");

    MyMatrix result (MatrixA.rows(), Design.columns());

    for (size_t r=0; r < MatrixA.rows(); r++)
    {
        for (size_t c=0; c < Design.columns(); c++)
        {
            result (r,c)=MatrixA(r,c)+Design(r,c);
        }
    }

    return result;

}

Автор: malyshkin 24.3.2010, 22:51
Может кто нибудь код просто инвертирования матрицы подскажет, а то я весь инет облазил (((

Автор: t_gran 25.3.2010, 06:52
http://articles.org.ru/cn/showdetail.php?cid=7260

Автор: malyshkin 25.3.2010, 18:59
Цитата(t_gran @ 25.3.2010,  06:52)
http://articles.org.ru/cn/showdetail.php?cid=7260

Это код, но просто пример работы 2008 версии. Мне нужен код инвертирования матрицы NxN. 


http://articles.org.ru/cn/showdetail.php?cid=7260

Это код, но просто пример работы 2008 версии. Мне нужен код инвертирования матрицы NxN. 


Автор: malyshkin 27.3.2010, 16:56
Люди!! Неужели никто не знает как инвертировать матрицу в С++ ?? 

Плзз хелп !! 

Автор: W4FhLF 27.3.2010, 19:00
ты за 3 дня в гугл своё вопрос вбить не пытался?

http://drobotenko.com/code_rus.html

Автор: malyshkin 3.4.2010, 15:52
Цитата(W4FhLF @ 27.3.2010,  19:00)
ты за 3 дня в гугл своё вопрос вбить не пытался?

http://drobotenko.com/code_rus.html

Ну как же не пытался, я все перепробовал. Дело в том что тут как показано в примере програмирование без main, так что тот код в ссылке не работает. А во вторых у меня все время выкидывает ошибку:  template <int N> error C2143: syntax error : missing ',' before 'constant' и я не пойму в чем дело. 

Я пытался сделать свое собственный код, но он работает только на небольших матрицах:

Код

MyMatrix InvertMatrix(MyMatrix& CovMatrix)
 {
    int N=CovMatrix.rows(); 
    int j, i, r;
    double factor;
    MyMatrix Inverted(N,N);
    Inverted=CreateUnitMatrix(N);
    for (i=0; i < N; i++)
    {
            factor=1.0/CovMatrix(i,i); //Making sure that the Diagonal is 1.
            for (j=0; j < N; j++)
            {    CovMatrix(i,j)=CovMatrix(i,j)*factor;
                Inverted(i,j)=Inverted(i,j)*factor;
            }
        
            //Making zeros in column i
            for (r=0; r < N; r++)
            {    
                double Numb=CovMatrix(r,i);
                for (size_t j=0; j < CovMatrix.rows(); j++)
                {    
                        if (r==i) {}//Do nothing (this is the row used for creating the other zeros
                        else
                        {
                        CovMatrix(r,j)=CovMatrix(r,j)-Numb*CovMatrix(i,j);                                
                        Inverted(r,j)=Inverted(r,j)-Numb*Inverted(i,j);            
                        }
                }
            }
    }
    RoundingZeros(Inverted);
    return Inverted;
}

MyMatrix CreateUnitMatrix(int Dimension)
{
    MyMatrix UnitMatrix(Dimension,Dimension);
        for(int j=0; j<Dimension; j++)
        {
             for(int i=0; i<Dimension; i++)
                { 
                    if (j==i)
                    {UnitMatrix(i,j)=1;}
                    else
                    {UnitMatrix(i,j)=0;}
                }
        }
        return UnitMatrix;
}


MyMatrix RoundingZeros(MyMatrix& Matrix)
{
    for (size_t i=0; i < Matrix.rows(); i++)
    {
        for (size_t j=0; j < Matrix.columns(); j++)
        {
            if(fabs(Matrix(i,j))<0.000000000001)
            {Matrix(i,j)=0.0;}
        }
    }
return Matrix;




Тут похоже не хватает пивотирования, то бишь если в диагонале стоит 0 то просто надо перепрыгивать этот ряд. У меня уже просто нет фантазии на это дело )) Если кто может помоч советом буду очень признателен !!!

Автор: inflamar 9.6.2010, 13:33
Цитата(malyshkin @  3.4.2010,  15:52 Найти цитируемый пост)
Ну как же не пытался, я все перепробовал. Дело в том что тут как показано в примере програмирование без main, так что тот код в ссылке не работает. А во вторых у меня все время выкидывает ошибку:  template <int N> error C2143: syntax error : missing ',' before 'constant' и я не пойму в чем дело. 


там есть рекомендации по шаблонам для разных версий VC

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)