Замена значения диагоналей в матрице (m x m) с помощью суммы столбцов в памяти с эффективным использованием памяти в C ++ - PullRequest
0 голосов
/ 07 августа 2009

У меня есть следующая матрица размера m = 4

   0.00000   0.09130   0.09130   0.00000
   0.04565   0.00000   0.00000   0.00000
   0.04565   0.00000   0.00000   0.00000
   0.00000   0.00000   0.00000   0.00000

И я хочу заменить диагональ этой матрицы с (1 - сумма его столбца). Результирующая матрица:

   0.90870   0.09130   0.09130   0.00000
   0.04565   0.90870   0.00000   0.00000
   0.04565   0.00000   0.90870   0.00000
   0.00000   0.00000   0.00000   1.00000

Так, например, для (1,1) имеем

   1 - (0.04565 + 0.04565 + 0.00000) = 0.90870

Теперь фактическая практика размером m очень велика масштаба от 10 ^ 6 до 10 ^ 7. Поэтому я не могу позволить себе сохранить исходную матрицу в контейнер.

Есть ли какой-нибудь эффективный для памяти альтернативный способ сделать это?

В настоящее время у меня есть реализация в вектор векторов. Он не может обрабатывать большие m (10 ^ 6).

    #include <iostream>
    #include <vector>
    #include <fstream>
    #include <sstream>
    #include <map>
    using namespace std;

      // Initialize Matrix Before Slurping
       vector <vector<double> > Matrix;
        Matrix.resize(nofRow);
        for(size_t i = 0; i < nofRow; ++i)
        {
            Matrix[i].resize(nofCol);
        }



        if (arg_count !=2 ) {
        cerr << "expected one argument" << endl;
        return EXIT_FAILURE;
    }

    string line;
    ifstream myfile (arg_vec[1]);

    // Slurpint it
    int count1=0;
    if (myfile.is_open())
    {   

        while (getline(myfile,line) )
        {
            stringstream ss(line);
            double Value;
            count1++;            

            int count2=0;
            while (ss >> Value) {
                count2++;
                Matrix[count1][count2] = Value;
            }


        }
        myfile.close();
    }
    else { cout << "Unable to open file"; }


     // Summing up Column;
        vector <double> ColSum;
        ColSum.resize(nofCol);
        for(size_t i = 0; i < nofRow; ++i)
        {
            for(size_t j = 0; j < nofCol; ++j)
            {
                //std::cout <<"["<<i<<"]"<<"["<<j<<"] = " <<Matrix[i][j]<<std::endl;
                ColSum[j] += Matrix[i][j];
            }
        }  



        // Printing it
        for(size_t k = 0; k < nofRow; ++k)
        {
            for(size_t l = 0; l < nofCol; ++l)
            {
                  if (k == l ) {
                      double OneMinusSum = 1 - ColSum[k];
                      //if (OneMinusSum < 0) { OneMinusSum = 1; };
                     std::cout << OneMinusSum << "\t";
                  }
                  else {
                      std::cout<< Matrix[k][l] << "\t";
                  }
            }

            std::cout << std::endl;
        }  

1 Ответ

4 голосов
/ 07 августа 2009

Создать вектор размером m для хранения диагонали. Затем просмотрите файл и добавьте i-й столбец каждой строки в diag [i]. Теперь снова просмотрите файл и выведите каждую строку, но замените значение i-го элемента в i-й строке на diag [i]. Таким образом, вам нужно всего лишь сохранить в памяти вектор размером m.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...