2015-08-31 28 views
-1

我有一個非常大的4D矩陣(31x31x86x127),我希望轉換成一個Javascript 4D數組。做這個的最好方式是什麼?將Matlab多維單元格數組轉換爲Javascript數組的最佳方式是什麼?

目前我試探性的做法將是兩種:

1)寫了Matlab矩陣成一個二進制文件,然後閱讀並建立的JavaScript。

2)使用JSONlab(http://www.mathworks.com/matlabcentral/fileexchange/33381-jsonlab--a-toolbox-to-encode-decode-json-files-in-matlab-octave)將Matlab矩陣轉換爲JSON字符串,然後編寫自定義解碼器將該JSON字符串轉換爲Javascript數組。問題是JSON文本文件是1.98GB ...

3)這可能是最好的方法。

fileID = fopen('test.bin', 'w'); fwrite(fileID,value,'double');

是TEST.bin,燒寫然後圍繞82MB,這實際上是我所期望的。 31 * 31 * 86 * 127 * 8bits/double = 82ish MB!然而,我怎麼讀(在瀏覽器中)這個二進制文件到一個4d Javascript數組?謝謝! 想法?

感謝您的幫助!

+0

第二種選擇,當然。 – Ratbert

+0

數字有問題。根據你的數字,它是630字節/數字。我知道,JSON是低效率的,但似乎有數百個空白的它 – Daniel

+0

JSON字符串看起來是這樣的:'''「testoutput」:{ \t \t「_ArrayType_」:「雙」, \t \t「_ArraySize_」 :[31,31,86,127], \t \t「_ArrayData_」:[-0.08103847277,-0.08300451255,-0.08514257385,-0.08685153974,....等''' – txizzle

回答

1

save是不寫的文本文件的權利的功能。使用savejsonsaveubjson並將文件名傳遞給該函數。不要使用這些函數的返回參數。這樣做我得到一個小於100MB的ubjson和小於150MB的json。

我原來的答覆的基礎上,對使用的代碼知識不足:

而不是寫你自己的二進制格式,請使用已有的二進制格式之一。嘗試將其寫入通用二進制json,jsonlab確實支持它。您最終應該擁有合理大小的數據,而不會失去標準化文件交換格式的優勢。

+0

使用ubjson,JSON文件仍然是1.3 gb ...通過我的計算,我只需要31 * 31 * 86 * 127 * 8bits/double = 83mb。我錯過了什麼?這些是一些示例條目:0.08103847277,-0.08300451255,-0.08514257385,-0.08685153974 – txizzle

+0

有問題。你能提供示例代碼來重現你的問題嗎?以「rand」或類似的開頭 – Daniel

+0

>> size(value)返回ans = 31 31 86 127. >> ubjson = saveubjson('foo',value); >>保存('value_ubjson.txt','ubjson','-ascii');.也許這是因爲我用ASCII保存文件的大小如此之大? – txizzle

0

我認爲最好的辦法是

  1. 出寫矩陣爲字符串或文本文件(二進制文件是沒有必要的)。您將需要n-1分隔符,其中n=4是您的案例的維數。作爲2D矩陣的一個例子,請參閱此Saturn Fiddle。下面的代碼
  2. 將文本文件讀入JavaScript字符串。如何做到這一點取決於您是否在服務器或Web瀏覽器上使用JavaScript。
  3. 將字符串解析爲JavaScript數組。您必須在(1)的分隔符處使用split函數,然後將它們輸入到這樣的數組中,如example

代碼部分(1):

% Welcome to SaturnAPI! 
% Start collaborating with MATLAB-Octave fiddles and accomplish more. 
% Start your script below these comments. 
A = [ 1 2 3 ; 4 5 6 ; 7 8 9 ] 
for ii=1:size(A)(1) 
    for jj=1:size(A)(2) 
     printf(" %d ", A(ii,jj)); 
    end 
    printf(";"); 
end 

代碼部分(3):

function make(dim, lvl, arr) { 
    if (lvl === 1) return []; 
    if (!lvl) lvl = dim; 
    if (!arr) arr = []; 
    for (var i = 0, l = dim; i < l; i += 1) { 
    arr[i] = make(dim, lvl - 1, arr[i]); 
    } 
    return arr; 
} 

var myMultiArray = make(4); 
+0

感謝您的輸入!我認爲一個問題實際上是文件大小(請參閱編輯 - 當轉換爲JSON時,所以ASCII,文件大小高達1.98GB,與文本文件相似...) – txizzle

相關問題