2013-05-02 71 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

相關問題