在我的程序中,我有一個很大(例如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應該足夠聰明,可以進行「寫時複製」,也就是說,只有在稍後更改時才複製這些內容。但是,這不是發生在我的情況 - 我的代碼只從數據庫讀取,並沒有改變它。
那麼,如何才能對結構進行高效的只讀引用?
+1好問題 - 我想知道這個答案。我嘗試過的每種方法(利用函數參數中的copy-on-write,使用全局變量,使用句柄類)導致代碼慢得多。 –
我以爲使用'libpointer'可能會有所幫助,但構建和使用指針似乎比我想象的要昂貴。 – patrickvacek
與陣列結構相比,結構陣列速度較慢。如果你的數據允許,嘗試轉換爲數組的結構,它可能會快得多。 http://www.mathworks.com/help/matlab/matlab_prog/memory-allocation.html#brh72ex-14 – jerad