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