Использование parfor на подматрице в Matlab - PullRequest
1 голос
/ 06 ноября 2011

У меня есть фрагмент кода, который делит матрицу изображения img на небольшие части и работает над ними параллельно.Но Матлаб говорит, что петлю parfor нельзя использовать, потому что индексируется outC{i,j}.Как это исправить?

Подматрицы имеют разные размеры.Если 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

Ответы [ 3 ]

4 голосов
/ 06 ноября 2011

Вы можете использовать линейное индексирование как для входа, так и для вывода.

Сначала я делаю вид ввода вашей формы и простой функции doWork:

>> 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;

Затем используйте линейное индексирование:

>> 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
1 голос
/ 07 ноября 2011

Хотя здесь есть много ответов, которые помогут использовать блок parfor для того, что вам нужно, я думаю, что еще лучшим решением может быть использование блока spmd .

Вместо того, чтобы разбивать изображение на более мелкие части в массиве ячеек, рассмотрите вместо этого преобразование его в распределенный массив , возможно, распределяя по тем же частям, что и сейчас.Внутри блока spmd вы можете выполнить функцию doWork, и она будет применена к любой части (со) распределенного массива, присутствующего на этом работнике.Наконец, вы можете собрать результаты и собрать их обратно клиенту.

Я считаю spmd более сложным для восприятия, чем parfor, но он становится очень мощным, как только вы получитеидея этого;и я думаю, что этот пример может быть очень удобно выражен в такой форме.

0 голосов
/ 06 ноября 2011

Просто создайте вектор выходов и затем используйте reshape, чтобы превратить его в матрицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...