2015-05-11 98 views
1

在我的代碼中,我更改了數組(int *),然後我想將它與matlab結果進行比較。將C++數組轉換爲matlab使用文件的大矩陣

因爲我的數組是1200×1000的元素。這需要永遠將其加載到MATLAB

我試圖複製打印輸出文件到MATLAB命令行...

for (int i = 0; i < _roiY1; i++) 
{ 
    for (int j = 0; j < newWidth; j++) 
    { 
     channel_gr[i*newWidth + j] = clipLevel; 
    } 
} 

ofstream myfile; 
myfile.open("C:\\Users\\gdarmon\\Desktop\\OpenCVcliptop.txt"); 
for (int i = 0; i < newHeight ; i++) 
{ 
    for (int j = 0; j < newWidth; j++) 
    { 
     myfile << channel_gr[i * newWidth + j] << ", "; 
    } 
    myfile<<";" <<endl; 
} 

有創建從C可讀矩陣數據更快的方法+ +?進入matlab?

回答

2

最簡單的答案是,以二進制形式傳輸數據要快得多,而不是像問題中所建議的那樣將文本渲染爲文本並將Matlab解析爲二進制文件。您可以在C/C++端使用fwrite(),在Matlab端使用fread()

int* my_data = ...; 
int my_data_count = ...; 

FILE* fid = fopen('my_data_file', 'wb'); 
fwrite((void*)my_data, sizeof(int), my_data_count, fid); 
fclose(fid); 

在Matlab中:

fid = fopen('my_data_file', 'r'); 
my_data = fread(fid, inf, '*int32'); 
fclose(fid); 

這也許值得一提的是,可以從內部Matlab的調用C/C++函數,所以這取決於你在做什麼可能是一個更簡單的架構(查找「 mex文件「)。

2

不要將輸出寫爲文本。

將您的矩陣寫入您的輸出文件中Matlab喜歡讀取的方式:二進制大數組。

ofstream myfile; 
myfile.open("C:\\Users\\gdarmon\\Desktop\\OpenCVcliptop.txt", ofstream::app::binary); 
myfile.write((char*) channel_gr, newHeight*newWidth*sizeof(channel_gr[0])); 

您可能要玩上輸出一些遊戲,以獲得陣列有序的,因爲MATLAB喜歡看數據的方式列行,而不是行列。在爲文件讀取器編寫mex文件插件時,我記得性能有了數量級的改進,但是我已經完成了一段時間。