2012-08-13 202 views
2

我有一些代码,我解析并从中提取一些矩阵。这些矩阵与某些标签相关联。为将来的访问存储数据

我想要做的就是将这些矩阵与它们的相关标签一起存储以供将来访问。所以基本上,我想创建一个文件/结构/数组/更新的东西,但如果我需要在同一个运行中,我也可以调用矩阵操作。而且,下一次运行程序时,我应该可以调用迄今为止已记录的数组和标签。最后,我想要一个矩阵和标签的数据库。

任何人都可以指出我正确的方向吗?

一些伪代码将不胜感激。

+0

您在使用哪种语言? – AGS 2012-08-14 01:04:37

+0

C抱歉应该提到 – JupiterOrange 2012-08-15 04:39:04

+0

@ user1571767,将您使用的语言作为标签......这是指导用户和Google员工的问题。 – Ben 2012-08-20 15:35:47

回答

0

您现在正在将矩阵存储在内存中的结构类型是相关的。

例如,你可以使用一个结构,例如,

struct { 
    size_t w; 
    size_t h; 
    double **values; 
    size_t n; 
    char **tags; 
} 

,然后将其写入到磁盘等,

fwrite(&(m->w), sizeof(size_t), 1, fp); 
fwrite(&(m->h), sizeof(size_t), 1, fp); 
for (y = 0; y < h; y++) 
    fwrite(m->values[y], sizeof(double), m->w, fp); 
fwrite(&(m->n), sizeof(size_t), 1, fp); 
for (y = 0; y < m->n; y++) 
{ 
    size_t len = strlen(m->tags[y]); 
    fwrite(&len, sizeof(size_t), 1, fp); 
    fwrite(m->tags[y], sizeof(char), len, fp); 
} 

和再读取用freads替换fwrites存储二维矩阵:

if (1 != fread(&(m->w), sizeof(size_t), 1, fp)) 
    // ERROR 
if (1 != fread(&(m->h), sizeof(size_t), 1, fp)) 
    // ERROR 
if (NULL == (m->values = malloc(sizeof(double *) * m->h))) 
    // ERROR: OUT OF MEMORY 
for (y = 0; y < h; y++) 
{ 
    if (NULL == (m->values[y] = malloc(sizeof(double) * m->w))) 
     // OOM 
    if (m->w != fread(m->values[y], sizeof(double), m->w, fp)) 
     // File truncated error 
} 
if (1 != fread(&(m->n), sizeof(size_t), 1, fp)) 
    // Truncated 
for (y = 0; y < m->n; y++) 
{ 
    size_t len; 
    fread(&len, sizeof(size_t), 1, fp); 
    if (NULL == (m->tags[y] = malloc(len + 1))) 
     // OOM 
    if (len != fread(m->tags[y], sizeof(char), len, fp)) 
     // Truncated 
    m->tags[y][len] = 0x0; // C strings must be zero-terminated 
} 

...但这只包括二维矩阵,并要求每个矩阵存储在到它自己的文件。

当然,你可能会进一步复杂化系统,并存储一个单独的“数据库”,其中包含一个头部,一些矩阵等,然后将每个矩阵依次存储。

从长远来看,您最好检查FITS标准Claudix是否允许将字符串序列化为字符串。如果他们这样做,你将能够将这些字符串存储到一个真正的数据库中(PostgreSQL,MySQL甚至SQLite3,所以你不必拥有一个独立的服务器)。这也可以让你在每次标签被修改时都不会重写整个whopper,并且有更多的可维护代码,代价是编写两个从内存对象转换为SQLite字段值的FITS-wrap函数,反之亦然。

如果FITS格式不允许将变量标记关联到矩阵和向量,则直接使用FITS可能会出现问题。

如果你不能修改FITS来写入字符串对象,你仍然可以使用上面的代码来写一个从矩阵对象到字符串的包装器(例如,通过base64编码产生的缓冲区)。一旦将矩阵作为字符串对象,它只是从那里得到的SQL:

INSERT INTO MatrixTable (matrixId, matrixEncoding) VALUES (...); 
INSERT INTO MatrixTags (matrixId, tagName, tagValue) VALUES (2418, 'Taken', '2012-08-20 at noon'); 
1

不知道我是否回答你的问题,但如果你正在寻找一个C API来读/写文件来存储向量,矩阵和其他等级数组(图片),你可以使用FITS文件格式。您可以标记存储的信息并执行其他操作。你可以找到CFITSIO库和文档在这里:http://heasarc.gsfc.nasa.gov/fitsio/(是的,NASA的东西;-))

从上面的页面:

CFITSIO is a library of C and Fortran subroutines for reading and 
writing data files in FITS (Flexible Image Transport System) data format. 
CFITSIO provides simple high-level routines for reading and writing FITS files 
that insulate the programmer from the internal complexities of the FITS format. 
CFITSIO also provides many advanced features for manipulating and filtering the 
information in FITS files. 

我用FITS用于存储多维数组(直方图,图像,.. ),包含不同数据类型的元素。这个库是有用的,你甚至可以通过使用特定的过滤器打开文件来选择向量/矩阵:不必担心复杂的I/O,编码或解码例程。