C++ C++;从二进制文件中写入和读取双精度矩阵

C++ C++;从二进制文件中写入和读取双精度矩阵,c++,io,binaryfiles,double-precision,C++,Io,Binaryfiles,Double Precision,在我的演讲之后,又出现了一个新问题: 我已经扩展了代码来执行矩阵二进制文件I/O,在测试一个简单的写和读操作时,我只检索到矩阵的第一行 我没有找到我的错误,以下是新代码: double** bytes_to_matrix_block(std::ifstream& iF, int size1, int size2) { double** m = new double*[size1]; double read; int i = 0, j = 0; if(!i

在我的演讲之后,又出现了一个新问题:

我已经扩展了代码来执行矩阵二进制文件I/O,在测试一个简单的写和读操作时,我只检索到矩阵的第一行

我没有找到我的错误,以下是新代码:

double** bytes_to_matrix_block(std::ifstream& iF, int size1, int size2) {
    double** m = new double*[size1];
    double read;
    int i = 0, j = 0;

    if(!iF) {
        std::cout << "opening file for reading error";
        throw 1;
    }
    while(i < size1 && !iF.eof()) {
        m[i] = new double[size2];
        while(j < size2 && !iF.eof()) {
            iF.read( reinterpret_cast<char*>( &read ), sizeof read );
            m[i][j] = read;
            std::cout << read << ", ";
            j++;
        }
        std::cout << std::endl;
        i++;
    }
    if(i < size1 || j < size2) {
        std::cout << "premature end of file while reading..." << std::endl;
        throw 1;
    }
    return m;
}

void matrix_block_to_bytes(double** m, int size1, int size2, std::ofstream& oF){

    if(!oF){
        std::cout << "opening file for writing error";
        throw 1;
    }

    double cdbl;

    for(int i = 0; i < size1; i++){
        for(int j = 0; j < size2; j++){
            cdbl = m[i][j];
            std::cout << cdbl << ", ";
            oF.write( reinterpret_cast<char*>( &cdbl ), sizeof cdbl );
        }
        std::cout << std::endl;
    }
}
双**字节到矩阵块(std::ifstream&iF,int-size1,int-size2){
双**m=新双*[size1];
双读;
int i=0,j=0;
如果(!如果){

读取时,您忘记了为新行将j重置为0

while(i < size1 && !iF.eof()) {
// Missing:
j = 0;
while(i
与问题无关,但只是一个提示——您可能希望将矩阵存储为
double*
而不是
double**
列或行主,或者如果需要,您将无法使用任何常见的BLAS库,至少不太容易……此外,您可能希望立即读取/写入数组,而不是
double
s它将更加高效…我已经使用了boost/ublas库,它工作得很好,但由于我只执行矩阵乘法,所以我使用double**进行乘法,效率更高(在三到四倍之间)而且它允许更好地使用多线程。关于一次读取/写入数组,我会考虑;)thanksuBlas实际上是最慢的一个,你可能想通过OpenMP查看Egen,它是多线程矩阵*矩阵。遗憾的是,它没有多线程矩阵*向量,这也是我做的…通过OpenMP。你知道它是不是多线程矩阵*矩阵吗ads LU分解和反转?另一个工作可能很有趣,因为某种原因,它不是多线程mv,BLAS/LAPACK和它们的任何实现(MKL、ACML、ATLAS和其他任何东西)也不是多线程mv,在没有多线程的情况下,它的工作速度要快得多,因为它花在同步上的时间比实际做事情的时间要多,这对于mm来说不是这样。在我自己的测试中,OpenMP for循环通常比任何使用单线程的BLAS实现慢10倍左右。关于LU——不知道tbh,但您可能很容易尝试,接口是simple&他们在版本3中为Eigen添加了一些非常漂亮的性能调优。