2014-02-20 26 views
7

在我的程序中,我有一個很大(例如100x100)的結構數組,每個結構都有相當數量的數據(例如1000個數字和其他一些字段)。例如:如何在Matlab中對結構進行「引用」?

for x = 100 : -1 : 1 
    for y = 100 : -1 : 1 
     database(y,x).data = rand(30); 
     database(y,x).name = sprintf('my %d %d', x, y); 
    end 
end 

我想用我的數據計算10-20行代碼;例如:

for x = 10 : 90 
    for y = 10 : 90 
     for dx = -9 : 9 
      for dy = -9 : 9 
       result = result + database(y + dy, x + dx).data(1, 1); 
       result = result + 2 * database(y + dy, x + dx).data(1, 2) * database(y + dy, x + dx).data(2, 2); 
       ... % more stuff here 
      end 
     end 
    end 
end 

我的代碼指的是數據庫作爲database(y + dy, x + dx)的當前元素。爲了使它更短,我給一個名字給它(C++把它叫做「參考」):

temp = database(y + dy, x + dx); 
result = result + temp.data(1, 1); 
result = result + 2 * temp.data(1, 2) * temp.data(2, 2); 

這使我的代碼更短,更清晰。但是,這也慢得多,分析表明,分配temp = ...佔用了我執行時間的70%。

所以我的假設是,Matlab 複製這個龐大的數據庫元素的內容,吃了我的時間。我認爲Matlab應該足夠聰明,可以進行「寫時複製」,也就是說,只有在稍後更改時才複製這些內容。但是,這不是發生在我的情況 - 我的代碼只從數據庫讀取,並沒有改變它。

那麼,如何才能對結構進行高效的只讀引用?

+0

+1好問題 - 我想知道這個答案。我嘗試過的每種方法(利用函數參數中的copy-on-write,使用全局變量,使用句柄類)導致代碼慢得多。 –

+0

我以爲使用'libpointer'可能會有所幫助,但構建和使用指針似乎比我想象的要昂貴。 – patrickvacek

+4

與陣列結構相比,結構陣列速度較慢。如果你的數據允許,嘗試轉換爲數組的結構,它可能會快得多。 http://www.mathworks.com/help/matlab/matlab_prog/memory-allocation.html#brh72ex-14 – jerad

回答

1

那麼,有肯定複製去,當你做:

temp = database(y + dy, x + dx) 

這可以通過使用可能降低:

temp = database(y + dy, x + dx).data 

但顯然這隻會工作,如果你在只是有興趣這部分代碼中的數據。

這就是說,我不確定您是否可以在不使用不方便的方法來構造數據的情況下解決此問題。首先,您可以在完成temp替換database(y + dy, x + dx)之後對您的代碼進行基準測試,以確保避免複製真的有幫助。如果是這樣,您可以嘗試將database(y + dy, x + dx)添加到子功能中,因爲如果足夠的話,通常子功能中的變量將與讀取功能一起使用。但是,我不確定這是否也適用於部分變量。

如果沒有上面的幫助,考慮到一些在書中最古老的忠告:

有關數據的大塊高效的計算,考慮使用矩陣。