[英]Octave force deepcopy
強制八度創建任何對象的真實副本的方法是什么? 結構是主要的興趣所在。
在我的問題中,我從一個循環中的另一個函數獲得了一個相當大的結構,但是對於當前任務,只需要其中的幾個。 例如:
for i=1:many
res=solver(params);
store1{i}=res.string1;
store2{i}=res.arr(:,1);
end
res
是一個相當大的數據塊,由於延遲復制,這些store
-s引用了該數據塊中字節的一小部分。 在存儲了這些微小的部分之后,我不需要res
本身,但是,由於該塊的中間被store
引用了,因此內存區域不適合下一次迭代獲得的res
(它們具有相同的大小),因此另一個分配了相當大的內存,然后又被一些微小的鏈接交叉,依此類推。
在不存儲部分res的情況下,該程序在前幾次迭代后成功地使內存消耗保持不變。
那么,如何制作結構字段的完整副本? 我嘗試過使用與struct
相關的函數(例如rmfield
但是這些函數保留引用而不是它們自己的對象。 我試圖將其分配包裝在其自身的函數中:new_struct = copy(rmfield(old_struct,“ bigdata”)); 函數c = copy(a); C = A; 結束; 順便說一下,這甚至對於數組也不起作用。 我對適用於任何泛型變量的方法感興趣。
a=cell(3,1);
for i=1:length(a);
r=rand(100000,1000);
a{i}=r(1:100,end);
whos; fflush(stdout);
pause(2);
end;
上面的代碼將導致存儲器使用逐步通過報道遠遠超過8.08 kb的生長whos
由於由存儲的引用a{i}
阻斷更大存儲器塊比實際需要的。 如果強制使用正確的副本,則不會出現問題。
對於數字類型,添加零就足以保證使用新數組。
c=a+0;
對於1 xn
char數組的字符串,以下幾行將起作用:
c=[a "a"](1:end-1);
多維char數組將需要與列連接:
c=[a true(size(a,1),1)](:,1:end-1);
這里true
用於生成大小與char兼容的偽數組。 (似乎沒有生成任意大小的char數組的程序方法) char(zeros(size(a,1),1))
和char(true(size(a,1),1))
導致在使用過程中過多的內存使用他們在某些電話上的創作。
請注意,空串聯c=[a ""];
不會導致復制。 也可以做c=[a+0 ""];
這將導致由於+0
而導致的復制,但是一個會推斷出類型轉換為double的大小是double的兩倍。 ( char(zeros(
似乎不會導致這種情況)
通常,您可以對它允許的類型使用強制類型轉換 ,以免像我在上面所做的那樣手動調整表達式:
typelist={"double","single","char"}; %full list of supported types is available in the link
class_of_a = typelist{ isa(a,typelist) };
c=typecast( [typecast(a,'single'); single(1)] (1:end-1), class_of_a);
Single似乎是八度中可用的最小數據類型。 請注意,此方法不支持邏輯。
顯然,您必須編寫自己的函數才能遍歷struct字段,使用上述方法復制它們,然后遞歸地訪問子結構。
(由於這里不涉及相關的復雜性,我寧願讓那些真正需要它的人來完成,我自己的問題由+0
來解決。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.