2012-04-13 108 views
1

目前我有一个parfor循环在MATLAB中对结构进行计算。虽然我的代码是有点长后,可以使用下面的例子来模拟:存储结构变量在Parfor循环中计算 - MATLAB

a.test = [1 2 3]; 
result = []; 

parfor i = 1:3 
    c = a; 
    c.test(2) = round(rand()); 

    if c.test(2) == 1 
    %# Store c in result 
    end 
end 

disp(result.test) %# Should show [1 1 3] 

一个(因而c)是一个非常大的结构,所以存储每次迭代是不适合我(因可行内存限制)。

理想情况下,我希望能够将c直接存储到我在parfor循环之前初始化的变量。看看MATLAB的Example: Using a Custom Reduction Function,我可以看到可以存储给定的迭代变量(不必存储每一次迭代),但我不完全理解它们的方法。我很困惑他们的函数如何产生2个独立的输出变量(看似),而函数只定义了一个输出变量。

我相信这是一个非常普遍的问题,但到目前为止,我的搜索没有得到任何有效的结果。

任何帮助将不胜感激。

+0

我对你的意思是什么在这里有些困惑:你想要做的并行迭代,只有采取通过一些测试(可能取消其他任务)的第一个结果?如果你正在讨论数组中的'cummax'函数,它只会执行一个输出(恰好是一个2元素数组)。 – Dougal 2012-04-13 05:25:08

+0

关于'cummax'功能,我现在看到它。起初我没有把A(1)和B(1)作为手续,但我看到它现在在做什么。尽管它不适用于我,但你仍在写作。取消其他任务并不重要,取得结果更重要。不过,下面的Jonas展示了一个简单的方法来做到这一点。 – rbhalla 2012-04-13 16:36:54

回答

2

你链接的例子并不完全是你想要的。但是,只能存储“好”结果。这里有一个简单的例子:

A=zeros(0,2); %# initialize A with no rows, two columns 
parfor i=1:6 
    tmp = rand(1); %# create some result 
    if tmp > 0.5 %# store only part of the results 
     A = [A;[tmp,i]]; %# store also the iteration number, in case it matters 
    end 
end 
>> A 

A = 

    0.6497 2.0000 
    0.5052 4.0000 
    0.9993 5.0000 
+0

非常感谢!我有点尴尬,认为我没有弄清楚我的自我。根据我读过的内容,我假设你应该在数组中的迭代槽中存储特定的迭代结果。以这种形式连接结果从来没有发生过。再次感谢你! – rbhalla 2012-04-13 16:39:43

+1

@rbOthree请注意,这实际上是一个parfor“缩减方法”,就像您链接的那个,只是一个内置的而非自定义的方法。 (在幕后,Matlab将收集结果并以某种任意方式连接它们,不一定按照迭代顺序或它们完成的顺序)。 – Dougal 2012-04-13 17:59:26