2011-11-06 2 views
1

이미지 매트릭스 img을 작은 조각으로 나누고 병렬로 작업하는 코드 조각이 있습니다. 그러나 Matlab은 parfor 루프를 사용할 수 없다고 말합니다. 이유는 outC{i,j}이 색인되기 때문입니다. 이 문제를 어떻게 해결할 수 있습니까?matlab에있는 서브 매트릭스에 parfor 사용하기

서브 매트릭스의 크기가 다릅니다. 셀 어레이를 사용하여 여기에 좋은 생각 인 경우 다음 img=[4x7], 보조 노트에

C=[3x3 3x3 3x1; 
    1x3 1x3 1x1] 

경우에, 나는 확실하지 않다. 그렇지 않다면 img을 어떻게 나눌 지 제안 해주십시오.

C=mat2cell(img, rowSplit, colSplit); 
[rowc,colc]=size(C); 
outC=cell(rowc,colc); 
parfor i=1:rowc 
    for j=1:colc 
     outC{i,j}=doWork(C{i,j}); 
    end 
end 

답변

4

입력 및 출력 모두 선형 인덱싱을 사용할 수 있습니다.

>> C= {rand(3) rand(3) rand(3,1); rand(1,3) rand(1,3) rand(1)}; 
>> C 
C = 
    [3x3 double] [3x3 double] [3x1 double] 
    [1x3 double] [1x3 double] [ 0.3922] 
>> doWork = @(x)2*x; 

그런 다음 선형 인덱싱을 사용합니다 :

먼저 나는 당신의 모양의 척 입력, 간단한 doWork 기능을

>> outC=cell(size(C)); 
>> parfor ci=1:numel(C) 
    outC{ci} = doWork(C{ci}); 
    end 

이 일을 있다고 빠른 검사 :

>> outC{2,1}./C{2,1} 
ans = 
    2  2  2 
0

그냥 출력의 벡터를 구축하고, 매트릭스에 그것을 만들 이후 reshape 사용합니다.

+0

이것이 어떻게 수행되는지 보여줄 수 있습니까? 서브 매트릭스들은 상이한 크기를 갖는다. img = [4x7]은 C = [3x3 3x3 3x1; 1x3 1x3 1x1]이된다. –

+0

@Usavich : 세포 배열과 관련이 있습니다. 'outC {i + j * colc} = ...'라고 쓰고 나서'reshape'라고하면 작동합니까? –

1

을 사용할 때 도움이 될 답변이 많이 있지만필요한 것을하기위한 차단, 나는 더 나은 해결책이 spmd 블록을 대신 사용하는 것이라고 생각할 것입니다.

이미지를 셀 배열의 더 작은 부분으로 분할하는 대신, 현재 그 부분을 distributed array으로 변환하여 현재 수행중인 부분과 동일한 부분에 배포하는 것이 좋습니다. spmd 블록 내에서 doWork 기능을 실행할 수 있으며 해당 작업자에있는 (공동) 분산 배열의 모든 부분에 적용됩니다. 마지막으로 결과를 조합하여 고객에게 gather을 다시 보낼 수 있습니다.

나는 parfor보다 파악하기가 더 복잡하지만, 일단 생각해 보면 매우 강력합니다. 이 예가 그 형태로 매우 편리하게 표현 될 수 있다고 생각합니다.

+0

코드 예제를 제공해 주시겠습니까? 거기에 필터를 적용 할 이미지가 있습니다. 예를 들어 반경이 5 인 필터를 parllelize하는 가장 좋은 방법은 무엇입니까? 고맙습니다. – Royi

관련 문제