2012-08-13 52 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,編碼或解碼例程。