gpt4 book ai didi

c++ - 用 C++ 中的内存有效方式用列和替换 (m x m) 矩阵中对角线的值

转载 作者:行者123 更新时间:2023-11-27 23:34:58 26 4
gpt4 key购买 nike

我有以下大小为 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。所以我不能存储初始矩阵到一个容器中。

是否有任何内存高效的替代方法来做到这一点?

current 是我用来吃它的实现成 vector 的 vector 。它无法处理大 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;
}

最佳答案

创建一个大小为 m 的 vector 来存储对角线。然后浏览文件并将每行的第 i 列添加到 diag[i]。现在再次检查文件并输出每一行,但将第 i 行第 i 个元素的值替换为 diag[i]。这样你只需要在内存中存储一​​个大小为 m 的 vector 。

关于c++ - 用 C++ 中的内存有效方式用列和替换 (m x m) 矩阵中对角线的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1244085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com