难以阅读犰狳领域的数据结构

Hard to read an armadillo field data structure

当我尝试用 C++ 在犰狳中编写一个字段对象然后读取它时,它运行良好。示例代码为:

//write the data to signal.bin file 
ofstream outfile;
outfile.open("signal.bin", ios::binary | ios::out);
//CLASS_NUM is the size of field, signal is the data need to save;
outfile.write((char*)&CLASS_NUM, sizeof(int)); // sizeof can take a type
outfile.write((char*)&signal, sizeof(field<mat>));
outfile.close();

//read the saved data
ifstream inFile( "signal.bin", ios::binary );
int K;
inFile.read( reinterpret_cast< char* >( &K ), sizeof( int ) );
field<mat> Input_Signal(K, 1);
inFile.read( reinterpret_cast< char* >( &Input_Signal ), sizeof( field<mat> ) );
inFile.close();

我通过输出数据进行检查,它们匹配。但是,当我注释掉代码中的写入部分时,这意味着我有一个 signal.bin 文件并且我需要读取它(代码的第二部分),

//read the saved data
 ifstream inFile( "signal.bin", ios::binary );
 int K;
 inFile.read( reinterpret_cast< char* >( &K ), sizeof( int ) );
 cout << K << endl;
 field<mat> Input_Signal(K, 1);
 inFile.read( reinterpret_cast< char* >( &Input_Signal ), sizeof( field<mat> ) );
 inFile.close();
 cout << Input_signal;

然后我得到如下输出:

1
[field column 0]
Segmentation fault: 11

1是字段的维度,所以我知道可以从文件中读取,那为什么我不能读取字段中保存的矩阵呢?

这里的问题很可能是你在写结构体field<mat>时没有考虑class中的实际数据。

例如,指向内存的指针仅在单个进程内有效。如果你写一个指向文件的指针并试图从另一个程序读取和使用它,该指针不再指向分配的数据,并且取消引用该指针将导致未定义的行为并且很可能像你这样的崩溃。

你需要研究serialization的主题来解决这个问题。

包含 mat 实例的 field class already has functions for saving and loading 字段。

例如:

field<mat> F(2,3);

F(0,0).randu(4,5);
F(1,0).randu(6,7);

F.print("F:");
F.save("signal.bin");

field<mat> G;

G.load("signal.bin");
G.print("G:");