2013-05-13 141 views
1

我正在运行一个非常大的元仿真,其中我通过两个超参数(可以说是x和y)以及每组超参数(x_i & y_j)我运行一个中等大小的子仿真。因此:matlab中的指针

for x=1:I 
    for y=1:j 
     subsimulation(x,y) 
    end 
end 

对于但每种subsimulation,数据的约50%是常见的所有其他subsimulation,或subsimulation(X_1,Y_1).commondata = subsimulation(X_2,Y_2).commondata。

这是非常相关的,因为到目前为止总的模拟结果文件大小是〜10Gb!显然,我想要保存常用子模拟数据1次以节省空间。然而,显而易见的解决方案是将它保存在一个地方,因为它直接调用subsimulation(x,y).commondata,所以会破坏我的绘图功能。

我不知道我是否能在内存%这样做 subsimulation(X,Y)= .commondata%指针1点的位置

如果再也无法工作,你看这个不太优雅的解决方案:

subsimulation(x,y).commondata='variable name' %string 

,然后加入

if(~isstruct(subsimulation(x,y).commondata)), 
    subsimulation(x,y).commondata=eval(subsimulation(x,y).commondata) 
end 

你们认为有什么解决方法是最好的?

感谢 DankMasterDan

+0

只要您不修改'subsimulation(x,y).commondata',数据就不会被复制。 – Oleg 2013-05-13 19:39:13

回答

2

你可以通过定义一个handle class做到这一点很容易。另请参阅the documentation

一个例子:

classdef SimulationCommonData < handle 
    properties 
     someData 
    end 

    methods 
     function this = SimulationCommonData(someData) 
      % Constructor 
      this.someData = someData; 
     end 
    end 
end 

然后使用这个样子,

commonData = SimulationCommonData(something); 
subsimulation(x, y).commondata = commonData; 
subsimulation(x, y+1).commondata = commonData; 
% These now point to the same reference (handle) 
1

按我的意见,只要你不修改common数据,你可以把它作为第三个输入和仍然不会在每次迭代中将数组复制到内存中(非常好的读数是Internal Matlab memory optimizations)。此图片将澄清:

enter image description here

正如你所看到的,在内存中的第一跳是由于创作的common,第二个到输出c的分配。如果数据在每次迭代中都被复制,则会看到更多的内存波动。例如,第三跳,然后减少,然后再次备份,依此类推...

遵循代码(我在每次迭代之间添加了一个pause以使其更清楚,在循环期间不会出现大的跳转) :

function out = foo(a,b,common) 
out = a+b+common; 
end 

for ii = 1:10; c = foo(ii,ii+1,common); pause(2); end