簡體   English   中英

倍頻力深度復制

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM