2013-05-02 70 views
0

我在Matlab中有下面的代码(当然简化了,但是这显示了问题的根源),它以前使用for;我想改变它使用parfor代替:Matlab - 如何转换此代码,以便它可以使用parfor运行?

isForeground = ones(1, size(In, 1)); 

% this used to be a simple for 
parfor i=1:X 
    data = output_of_some_expensive_function(); 

    % do some other stuff with data here 

    % the part below is the problem; isForeground basically keeps track of all the places where data was never a zero 
    isForeground(data == 0) = 0; 
end 

Matlab的抱怨说,Valid indices for 'isForeground' are restricted in PARFOR loops。有没有办法解决这个问题?我想只保存所有data输出,然后运行一个单独的传统for循环,我将执行isForeground部分,但问题是X非常大,并且保存所有数据输出将会占用大量内存。

是否有另一种方法呢?

回答

1

结果中1的密度是多少?如果它们稀疏(即大部分为0),则find()可能会将逻辑掩码缩小为数字索引列表。如果需要进一步压缩,则根据X的大小,可以将存储的掩码转换为uint32uint16,这将占用double的1/2或1/4的空间。

然后将结果存储在仍由循环索引切片的临时变量中,然后将它们合并到parfor循环之外,就像您说的那样。

masks = cell(1, X); 
parfor i=1:X 
    data = output_of_some_expensive_function(); 

    % do some other stuff with data here 

    % stash the loop results in a non-combining manner 
    masks{i} = uint32(find(data == 0)); 
end 

% Combine in regular for loop 

for i=1:X 
    isForeground(double(masks{i})) = 0; 
end 

如果这还不够,也许你可以写每个结果屏蔽到磁盘的文件.MAT上通常可见的驱动器空间或其他持久性对象存储。如果您的parfor的工作人员在本地计算机上,则任何驱动器都可以工作,并且速度应该很快,因为您可能只需通过操作系统的磁盘缓存。

您也可以尝试将输出掩码转换为可压缩格式。例如。在其上运行diff()并将结果压缩到byte[]“blob”,然后在正常的for循环中应用掩码之前进行相反的操作。根据口罩的结构,这可以节省额外的空间。

注意:逻辑需要比您想象的更多的存储空间;即使每个元素只有一个有意义的信息位,它也需要一整个字节的内存,因为这是最小的可寻址内存单元。

+0

这似乎是一个很好的解决方案;然而,我在代码中发现了额外的依赖关系,所以最终看起来我唯一的可能性就是保存所有数据并在最后运行另一个for循环,所以我不会使用它。感谢您的回答,虽然 – houbysoft 2013-05-02 04:02:05

+0

没有问题。祝你好运! – 2013-05-02 04:12:56

-1

此代码现在使用结构来传递数据出来PARFOR的:

In = eye(3); % some input 
X = size(In, 1); 

isForeground = ones(1, X); 
isForeground_struct = repmat(struct('data', ones(1, X)), [1, X]); 

% is used to be a simple for 
parfor i=1:X 
    data = ones(1, X); 
    data(randi(X)) = 0; % a random operator just to make an example for data 

    isForeground_struct(i).data = data; 
end 

isForeground = prod(cat(1, isForeground_struct.data)); % assuming you want AND combination 
+0

-1此代码有错误,并且不能解决问题,因为它仍在使用不允许的索引表单。 – 2013-05-02 03:46:06

相关问题