在 C/C++ 中将矩阵读取到二维数组

Posted

技术标签:

【中文标题】在 C/C++ 中将矩阵读取到二维数组【英文标题】:Read matrix to 2D array in C/C++ 【发布时间】:2014-08-26 20:02:22 【问题描述】:

在 C++ 中将数字矩阵读取/输入到数组中的最简单方法是什么?

这是文件内容(尺寸未知):

283 278 284 290 290 286 273 266 266 266 261 252 246
382 380 379 381 382 379 384 387 385 382 376 365 357 
285 282 281 279 276 273 272 264 255 255 247 243 237 
196 190 186 183 183 180 179 186 191 195 195 188 187 
245 237 226 220 221 222 225 228 234 245 252 264 272 
283 278 284 290 290 286 273 266 266 266 261 252 246

我已经尝试了很多建议的代码,但它们似乎都不适合我...... :( 我想对矩阵执行以下操作:

MATRIX[i][j] = MATRIX[i][j] + rand()-RAND_MAX/2;

在 if 循环中包含什么来读取矩阵??

#include <iostream>
#include <fstream>

ifstream pFile;
pFile.open("test.txt");

if (pFile.is_open())

    // SOMETHING HERE!!!!!??

else

    printf("Error reading the file!\n");
    return 1;

【问题讨论】:

使用std::vector&lt;std::vector&lt;int&gt; &gt;。你会为自己省去很多的麻烦。 到目前为止您尝试过什么?这里已经有数百个关于如何读取文件的线程。 【参考方案1】:

首先,正如其他人建议的那样,使用std::vector&lt;std::vector&lt;int&gt;&gt;。它会让事情变得简单得多。

#include <vector>
typedef std::vector<int> IntVector;
typedef std::vector<IntVector> IntVector2D;

所以我们的类型是IntVector2D。 (我定义了后面要使用的一维向量)

接下来,我们要设置一个循环,一次读取一行,解析该行,并将在该行中找到的 int 存储在矩阵的一行中。为此,我们可以将该行读入字符串,然后使用istringstream 进行解析。

最后,对于存储的每一行,我们根据您的随机数函数将更改应用于行上的每个项目。

以下是所有这些的示例:

#include <fstream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <iostream>

typedef std::vector<int> IntVector;
typedef std::vector<IntVector> IntVector2D;

using namespace std;

// random number function to apply
int ApplyRand(int num)
 return num + rand() - RAND_MAX/2; 

void OutputMatrix(const IntVector2D& m)

    cout << "\n";
    IntVector2D::const_iterator it = m.begin();
    while (it != m.end())
    
        copy(it->begin(), it->end(), ostream_iterator<int>(cout, " "));
        cout << "\n";
        ++it;
    


// Transform the numbers in the matrix
void TransformMatrix(IntVector2D& m)

    IntVector2D::iterator it = m.begin();
    while (it != m.end())
    
        transform(it->begin(), it->end(), it->begin(), ApplyRand);
        ++it;
    


int main()

    IntVector2D matrix;
    ifstream pFile("test.txt");
    string s;

    while ( std::getline(pFile, s) )
    
        // create empty row on back of matrix
        matrix.push_back(IntVector());
        IntVector& vBack = matrix.back();

        // create an istringstream to parse
        istringstream ss(s);

        // parse the data, adding each number to the last row of the matrix
        copy(istream_iterator<int>(ss), istream_iterator<int>(), back_inserter(vBack));
    
    // output the matrix
    OutputMatrix(matrix);

    // Apply rand to each number
    TransformMatrix(matrix);

    // output the updated matrix 
    OutputMatrix(matrix);

输出:

283 278 284 290 290 286 273 266 266 266 261 252 246
382 380 379 381 382 379 384 387 385 382 376 365 357
285 282 281 279 276 273 272 264 255 255 247 243 237
196 190 186 183 183 180 179 186 191 195 195 188 187
245 237 226 220 221 222 225 228 234 245 252 264 272
283 278 284 290 290 286 273 266 266 266 261 252 246

-16059 2362 -9765 10407 3076 -373 -4632 13241 10845 8347 -10417 12014 7144826 
-6042 -15513 -13007 -4059 -11177 -10563 16395 -1394 -12099 -15854 -15726 -3644
1323 2615 3616 3791 -10660 5616 -1340 -4581 -14259 3784 9531 10159 889
-6293 12510 7614 15122 14133 1470 -11540 -1056 -8481 12065 -9320 9352 11448
16524 16611 3880 -3304 -7439 -6420 11371 -15377 -3833 -13103 6059 -14277 -15823
14006 -7065 -7157 3171 6555 11349 7695 -227 -9388 8253 -772 -1125 14964

注意使用std::copyistringstream中提取项目,back_inserter负责在矩阵的最后一行调用push_back

此外,std::transform 的使用允许我们在每个元素上调用一个函数,使用 ApplyRand 作为执行此转换的函数,将元素从原始值“转换”为更改后的值。

【讨论】:

【参考方案2】:

这是一种使用向量读取未知大小矩阵的简单方法。如果您不知道要使用的维度,向量相对于数组的优势在于,如果空间不足,您无需担心调整数据结构的大小。

    std::vector<std::vector<int> > matrix;
    std::string line;
    int value;

    // read in matrix
    std::ifstream file("path/to/file.txt");
    while(std::getline(file, line)) 
            std::vector<int> row;
            std::istringstream iss(line);
            while(iss >> value)
                    row.push_back(value);
            
            matrix.push_back(row);
    

【讨论】:

【参考方案3】:

首先,我们声明一个向量向量来保存我们的矩阵。 请注意,如果您不知道正在使用的维度,向量相对于数组的优势在于,如果空间不足,您无需担心调整数据结构的大小。这就是我们使用向量而不是数组的原因。 之后,我们使用 stringstream 从输入中读取所有整数。 在一个 while 循环中,我们继续,直到仍然退出另一行(如果没有更多行,getline() 返回 true)。在每一步中,我们从输入中读取一行(无论它有多长,我们都会完整地读取它),然后我们分离该行的整数并使用字符串流将它们放入一个向量中。然后,我们将该向量添加到我们的 matrxi 2D 向量中。 我写了这段代码:

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

int main () 

    fstream cin;
    cin.open("input.txt");

    string s;
    vector <vector <int> > matrix;

        while (getline(cin, s)) 

        stringstream input(s);

        int temp;
        vector <int> currentLine;
        while (input >> temp)
            currentLine.push_back(temp);

        matrix.push_back(currentLine);

        

        for (unsigned int i = 0; i < matrix.size(); i++) 
            for (unsigned int j = 0; j < matrix[i].size(); j++)
                cout << matrix[i][j] << " ";
            cout << endl;
        

    return 0;

输出正是您想要的。请注意,第一行看不到,我必须向上滚动才能看到,但要确保它在那里。试试看。这是输出:

【讨论】:

谢谢,这太完美了! (:请您解释一下。 不客气@Vito 看看我的更新。如果有什么不明白的,请告诉我。如果它对你有用,请接受我的回答。 :)

以上是关于在 C/C++ 中将矩阵读取到二维数组的主要内容,如果未能解决你的问题,请参考以下文章

C / C ++将字符串放入二维数组?

python数组求和

在 Numpy Python 中将一维数组附加到二维数组

在jQuery中将元素添加到二维数组[重复]

在 Swift 中将一列值插入到二维数组中

编组二维数组