Использование классифицированных переменных в циклах Parallel for в Matlab

Привет, я пытаюсь запустить код для реконструкции изображений 2D-проекций с использованием преобразования iradon. Моя цель значительно сократить время, в течение которого я пытаюсь использовать параллельный цикл for в своем профиле локального кластера моего ноутбука. Но я, кажется, получаю ошибку, которую мне трудно отладить.

Ошибка: Переменные данные в парфоре не могут быть классифицированы.

Мой код-

clc;
close all;
clear all;

tic
% projection_length = input('Define projection length (px) = ');
projection_length = 4100;  % which means our ouput will have 4100 cross sectional images of the capillary tube

parfor q = 1:projection_length

  for i = 1:5  % typically 500, since we take 500 projections around the capillary tube 0.72 deg inc
      if length(num2str(i)) == 1
           data(q,:, i) = imread(['pre00' num2str(i) '.tif'], 'PixelRegion', {[1 1600], [q q]});
      elseif length(num2str(i)) == 2
           data(q,:, i) = imread(['pre0' num2str(i) '.tif'], 'PixelRegion', {[1 1600], [q q]});
      elseif length(num2str(i)) == 3
           data(q,:, i) = imread(['pre' num2str(i) '.tif'], 'PixelRegion', {[1 1600], [q q]});
      end

      disp(['Analyzing projection ' num2str(q)  ' of ' num2str(projection_length) ', Angle ' num2str(i) '...']);
  end
  H = iradon( data(q,:,:), 0.72, 'Hann', 0.8, 1600);
end
toc

person Tushar Anchan    schedule 21.05.2015    source источник


Ответы (1)


Во-первых, я бы рекомендовал использовать sprintf для создания имени файла, например:

fname = sprintf('pre%03d.tif', i);
data(q, :, i) = imread(fname, ...);

Это правильно заполнит нулем fname.

Проблема с data в том, что вы индексируете его по-разному, и, к сожалению, parfor не может это правильно понять. (Это должно отображаться как «красное» предупреждение в редакторе MATLAB, которое иногда может дать вам более точную информацию о parfor проблемах). Я хотел бы решить проблему примерно так:

parfor q = 1:projection_length
    tmpData = zeros(N, numFiles); % insert correct value of N here
    for i = 1:numFiles
        fname = ...;
        tmpData(:, i) = imread(fname, ...);
    end
    data(q, :, :) = tmpData;
    H = iradon(tmpData, ...);
end

Я не уверен, что вы пытаетесь сделать с H - parfor будет рассматривать это как временную переменную, и значение будет недоступно после цикла.

person Edric    schedule 22.05.2015
comment
Моя цель — сделать это более эффективным, т. е. значительно сократить время, необходимое для запуска. Есть ли что-нибудь еще, что можно сделать, чтобы сократить время, затрачиваемое на выделение памяти. Можно ли предопределить временные данные перед циклом parforloop? Сократит ли это время? Или есть другие предложения для того же? - person Tushar Anchan; 22.05.2015
comment
Эй, а код после ирадона здесь следующий, я должен сохранять каждое реконструированное изображение. H = iradon(tmpData, 0,72, 'Ханн', 0,8, 1600); postfname= sprintf('pos%06d.tif', q); imwrite(H, postfname); Но я продолжаю получать сообщение об ошибке: ошибка при использовании parallel_function (строка 589). Не удалось открыть «pos001328.tif» для записи. Стек ошибок: writetif.m на 107 imwrite.m на 477 Ошибка в Parallel_Reconstruction (строка 8) parfor q = 1:projection_length - person Tushar Anchan; 22.05.2015
comment
Он выполняет несколько итераций и выдает эту ошибку! Любые предложения по отладке этого? - person Tushar Anchan; 22.05.2015