2012-06-28 6 views
1
float aMatrix[10][11]; 
float bMatrix[10]; 

// называется такое ... solveMatrix(aMatrix, bMatrix, actualCol);Gaussian вопрос ликвидации в решении матрицы

float* solveMatrix(float aMatrix[][DEFCOLS+1],float bMatrix[DEFCOLS], size_t cols){ 
    std::cout << "\nInside solveMatrix...: " << endl; 
    size_t N2 = cols; 

std::cout << "\N2 is...: " << N2 << endl; 
for(size_t p=0; p<N2; p++){ 
    //std::cout << "\nInside 1st for loop...: " << endl; 
    // find pivot row and swap 
    int max = p; 

    for(size_t i=p+1; i<N2; i++){ 
     //std::cout << "\nInside 2nd for loop...: " << endl; 
     if (abs(aMatrix[i][p]) > abs(aMatrix[max][p])){ 
      max = i; 
     } 
    } 

    //std::cout << "\nJust b4 all the swapping...: " << endl; 

    float temp[] = { *aMatrix[p] }; 
    *aMatrix[p] = *aMatrix[max]; 

    *aMatrix[max] = *temp; 

    float t = bMatrix[p]; 
    bMatrix[p] = bMatrix[max]; 


    bMatrix[max] = t; 
    //std::cout << "\nDone all the swapping...: " << endl; 

    if (abs(aMatrix[p][p]) <= MINISCULE) { 
     //std::cout << "***** Error matrix value too small. Matrix is singular" << endl; 
     //exit; 
    } 

    //std::cout << "\nJust the pivoting...: " << endl; 

    // Pivot /in A and b 
    for(size_t i=p+1; i<N2; i++){ 
     //std::cout << "\nInside the 1st pivoting loop...: " << endl; 

     //std::cout << "\nAbout to do the [aMatrix[p][p]] division in back subst..: " << endl; 
     float alpha = aMatrix[i][p]/aMatrix[p][p]; 

     bMatrix[i] = alpha * bMatrix[p]; 

     for(size_t j=p; j<N2; j++){ 
      //std::cout << "\nInside the 2nd pivoting loop...: " << endl; 
      aMatrix[i][j] -= alpha * aMatrix[p][j]; 
     } 

    } 
    std::cout << "\nAbout to do the back subst..: " << endl; 
    // back subst. 
    float outMatrix[DEFROWS] = {0.0}; 

    for(size_t i=N2-1; i>=0; i--){ 
     std::cout << "\nInside the 1st back subst for loop..: " << endl; 
     float sum = 0.0; 

     for(size_t j=i+1; j<N2; j++){ 
      std::cout << "\nInside the 2nd back subst for loop..: " << endl; 
      sum += aMatrix[i][j] * outMatrix[j]; 
     } 

     std::cout << "\nAbout to do the [aMatrix[i][i]] division in back subst..: " << endl; 

      std::cout << "\n*outMatrix[i]: " << outMatrix[i] << endl; 
      std::cout << "\n(bMatrix[i] - sum) : " << (bMatrix[i] - sum) << endl; 
      std::cout << "\n****aMatrix[i][i] : " << aMatrix[i][i] << endl;    

     if (aMatrix[i][i] > 0){ 
      std::cout << "\nDid the division [aMatrix[i][i]] > 0 division in back subst..: " << endl; 
      std::cout << "\n*outMatrix[i]: " << outMatrix[i] << endl; 
      std::cout << "\n(bMatrix[i] - sum) : " << (bMatrix[i] - sum) << endl; 
      std::cout << "\naMatrix[i][i] : " << aMatrix[i][i] << endl; 

      outMatrix[i] = (bMatrix[i] - sum)/aMatrix[i][i]; 

      std::cout << "\nDid the division [aMatrix[i][i]] > 0 division in back subst..DONE: " << endl; 

     }else { 
      std::cout << "\nDid the divirion [aMatrix[i][i]] = 0 division in back subst..: " << endl; 
      outMatrix[i] = 0.0; 
      std::cout << "\nDid the divirion [aMatrix[i][i]] = 0 division in back subst..DONE: " << endl; 
     } 

     std::cout << "\nDid the [aMatrix[i][i]] division in back subst..: " << endl; 
    } 

    std::cout << "\nLeft the back subst for loops..: " << endl; 

    return outMatrix; 
} 
} // end solveMatrix() 

Моя проблема заключается в том, что моя программа, кажется, бежит, но, кажется, бежит мимо конца матрицы и сбои. Плюс я получаю несколько больших экспоненциальных чисел, а наибольшие числа, которые у меня есть в массиве, составляют от 1 до 10.

вот скриншот выхода: не может вставляться с инструмента для обрезки. Но проблема, похоже, начинается после начала «обратной замены». Любая помощь будет оценена по достоинству.

+0

Очевидно, что вы не можете вставить инструмент для обрезки. Сохраните изображение на диске, затем выберите «Вставить изображение»> «С компьютера»> «Обзор» – Alexander

+3

Рассмотрите возможность использования LAPACK для этого. –

+0

@DeepYellow: По большей части, если вы делаете полномасштабное численное моделирование, я бы согласился. Но если вы пытаетесь узнать об этом или если вам это нужно в одном действительно специализированном случае, я бы не согласился. LAPACK может быть немного для небольшого проекта. –

ответ

0

Я не уверен, что все проблемы, но одна ясная проблема - ваш outMatrix. Вы возвращаете указатель на локальный массив. Массив уничтожается в конце функции. Указатель, который вы возвращаете, теперь неактивен.

Изменить эту строку:

float outMatrix[DEFROWS] = {0.0}; 

To:

float* outMatrix = new float[DEFROWS]; 

Тогда вам нужно обнулить это.

Примечание: Было бы лучше, если бы вы использовали vector<float> и вернулся, но ты написал это с сырым указателем, так что я отвечаю с сырым указателем. Исходные указатели приводят к утечкам памяти. Их следует избегать, когда это возможно. С современным C++ редко приходится выделять необработанный указатель.

EDIT: См Effective C++ Item #31

edit2: Изменение в использовании вектора, если ваш компилятор поддерживает операторы перемещение и конструкторы, как определено в стандарте C++ 11, а затем возвращает вектор дешевая операция.

std::vector<float> solveMatrix(/* Your arguments */) 
{ 

    std::vector<float> outMatrix(DEFROWS, 0.0); 

    // Your code 

    return outMatrix; 
} 
+0

Я попробую, спасибо за быстрый ответ. –

+0

Я принял ваше предложение и использовал векторный титр матрицы, и все выглядит немного лучше, однако программа не будет вводить второй цикл цикла после объявления вектора. Я провел его через отладчик, и я заметил, что переменные i, j всегда имеют большое количество 8-значных цифр, даже если я их инициализирую до 0 ?? !! Любые идеи были бы полезны - Спасибо. –

+0

@MichealNoel - Что такое значение 'cols', которое передается. Вы устанавливаете' N2 = cols' в верхней части функции. Затем вы устанавливаете 'i = N2' и' j = i + 1'. Если N2 задается с ненужным значением, то вы можете иметь эти проблемы. – pstrjds