Octave 倍频程力深度复制 问题

Octave 倍频程力深度复制 问题,octave,deep-copy,Octave,Deep Copy,强制八度音阶以创建任何对象的真实副本的方法有哪些?结构是主要的兴趣 我的根本问题 在我的问题中,我从循环中的另一个函数获得了一个相当大的结构,但是对于当前任务,只需要它的几部分。例如: for i=1:many res=solver(params); store1{i}=res.string1; store2{i}=res.arr(:,1); end res是一个相当大的数据块,由于延迟复制,这些store-s是对该数据块中很小部分字节的引用。在我存储这些小部分之后,我

强制八度音阶以创建任何对象的真实副本的方法有哪些?结构是主要的兴趣

我的根本问题 在我的问题中,我从循环中的另一个函数获得了一个相当大的结构,但是对于当前任务,只需要它的几部分。例如:

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
,但这些函数保留引用而不是自己的对象。 我已尝试将的赋值封装在其自身的函数中: 新结构=复制(rmfield(旧结构,“bigdata”); 功能c=副本(a); c=a; 结束; 顺便说一下,这甚至对阵列也不起作用。 我对适用于任何泛型变量的方法感兴趣

问题的最小工作示例 由于
a{i}
存储的引用阻塞了比实际需要更大的内存块,上述代码将导致内存使用量逐渐增长,远远超过
whos
报告的8.08 kb。如果强制执行正确的复制,则问题不存在。

数字阵列 对于数字类型,加上零就足以保证一个新数组

c=a+0;
串 对于
1 x n
char数组的字符串,可以使用以下行:

c=[a "a"](1:end-1);
多维字符数组需要与列连接:

c=[a true(size(a,1),1)](:,1:end-1);  
此处
true
用于生成与字符大小兼容的虚拟数组。(似乎没有生成任意大小的char数组的过程方法)
char(零(大小(a,1),1))
char(真(大小(a,1),1))
在某些调用的创建过程中导致内存使用过多

请注意,空连接
c=[a”“]不会导致复制。也可以执行
c=[a+0”“]
将导致由于
+0
而导致复制,但可以推断出大小为8倍的double之间的类型转换。(
char(零(
似乎不会引起这种情况)

其他类型 通常,您可以使用它所允许的类型,以避免像我上面所做的那样手动定制表达式:

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似乎是八度音阶中可用的最小数据类型。 请注意,此方法不支持逻辑

复制结构 显然,您必须编写自己的函数来绕过结构字段,用上述方法复制它们,然后递归地转到子结构。
(因为它不涉及与此相关的复杂性,我宁愿让那些真正需要它的人来做,我自己的问题由
+0
解决。)

数字数组 对于数字类型,加上零就足以保证一个新数组

c=a+0;
串 对于
1 x n
char数组的字符串,可以使用以下行:

c=[a "a"](1:end-1);
多维字符数组需要与列连接:

c=[a true(size(a,1),1)](:,1:end-1);  
这里
true
用于生成大小与char兼容的虚拟数组。(似乎没有生成任意大小的char数组的过程方法)
char(零(大小(a,1),1))
char(true(大小(a,1),1))
在创建某些调用时导致内存使用过量

请注意,空连接
c=[a”“];
不会导致复制。也可以执行
c=[a+0”“];
,这将导致复制,因为
+0
,但可以推断到大小为8倍的double之间的类型转换。(
字符(零(
似乎不会导致这种情况)

其他类型 通常,您可以使用它所允许的类型,以避免像我上面所做的那样手动定制表达式:

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似乎是八度音阶中可用的最小数据类型。 请注意,此方法不支持逻辑

复制结构 显然,您必须编写自己的函数来绕过结构字段,用上述方法复制它们,然后递归地转到子结构。

(因为它不涉及与此相关的复杂性,我宁愿让那些真正需要它的人来做,我自己的问题由
+0
解决。)

+0
的一个问题是它可能会更改数据类型(在您的示例中,它会更改您的字符串)。另一种方法也不是很优雅,但能够处理任意数据,就是将所需的变量写入临时文件,清除大型结构,然后从文件中读取。是的,这就是为什么我在这里提到空字符串的串联,尽管它本身确实会被丢弃。我现在将详细说明答案。问题是
+0
是指它可能会更改数据类型(在您的示例中,它将更改您的字符串)。另一种方法也不是很优雅,但能够处理任意数据,就是将所需的变量写入临时文件,清除大型结构,然后从文件中读取。是的,这就是为什么我在这里提到空字符串的串联,尽管它本身会被丢弃。我现在将详细说明答案。您可能有b如果你能在八度音阶邮件列表中找到答案,那就更好了。如果你能在八度音阶邮件列表中找到答案,A会更有用。