2015-07-24 4 views
0

Я пытаюсь ускорить мой код, используя parfor. Цель кода - сдвинуть трехмерное квадратное окно на трехмерном изображении и для каждого блока mxmxm применить функцию.MATLAB parfor cuting 3D-массив

Я написал этот код:

function [ o_image ] = SlidingWindow(i_image, i_padSize, i_fun, i_options) 
%SLIDINGWINDOW Summary of this function goes here 
% Detailed explanation goes here 

o_image = zeros(size(i_image,1),size(i_image,2),size(i_image,3)); 
i_image = padarray(i_image,i_padSize,'symmetric'); 
i_padSize = num2cell(i_padSize); 
[m,n,p] = deal(i_padSize{:}); 
[row,col,depth] = size(i_image); 
windowShape = i_options.windowShape; 
mask = i_options.mask; 
parfor (i = m+1:row-m,i_options.cores) 
    temp = i_image(i-m:i+m,:,:); 
    for j = n+1:col-n 
     for h = p+1:depth-p 
      ii = i-m; 
      jj = j-n; 
      hh = h-p; 
      temp = temp(:,j-n:j+n, h-p:h+p); 
      o_image(ii,jj,hh) = parfeval(i_fun, temp, windowShape, mask); 
     end 
    end 
end 

end 

Я получаю одно предупреждение и одна ошибка, которую я не понимаю, как решить. Предупреждение говорит:

Весь массив или структура «i_image» является широковещательной переменной.

Ошибка говорит:

петля PARFOR не может работать из-за пути переменной 'o_image' используется.

Я не понимаю, как исправить эти две вещи. Любая помощь очень ценится!

ответ

0

Насколько я понимаю, parfeval заботится о выполнении вашей функции на доступном количестве рабочих, поэтому ее не нужно окружать parfor. Предполагая, что у вас уже есть активный , , изменение внешнего parfor на for устраняет обе проблемы.

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

Мне кажется, что код может быть оптимизирован другими способами, в основном по . Я хотел бы предложить вам заглянула в следующие ресурсы:

  • This question, для получения дополнительной информации о parfeval.
  • Примеры использования bsxfun и permute и их целевые показатели: ex1, ex2, ex3.

P.S .: 2-ая часть (i = m+1:row-m,i_options.cores) кажется неуместным ...

 Смежные вопросы

  • Нет связанных вопросов^_^