Распараллеливание кода MATLAB - PullRequest
0 голосов
/ 09 мая 2018

Здравствуйте! Я хочу использовать распараллеливание моего кода MATLAB для запуска Высокопроизводительного вычислительного сервера. Это код для создания базы данных изображений для глубокого обучения. Для распараллеливания кода я нашел цикл forfor. Но я использовал это с первым циклом или со вторым циклом, который показывает мне, что parfor ошибки не может быть запущен из-за переменных imdb и image_counter. Кто-нибудь, пожалуйста, помогите мне изменить код для работы с parfor

for i = 1:length(cur_images)
            X = sprintf('image Numb: %d ',i);
            disp(X)
        cur_image = load(cur_images{i,:});
        cur_image=(cur_image.Image.crop);


        %----------------------------------------------

        cur_image = imresize(cur_image, image_size);


        if(rgb < 1)
            imdb.images.data(:,:,1,image_counter) = cur_image;
        else
            imdb.images.data(:,:,1,image_counter) = cur_image(:,:,1); 
            imdb.images.data(:,:,2,image_counter) = cur_image(:,:,2);
            imdb.images.data(:,:,3,image_counter) = cur_image(:,:,3); 
            imdb.images.data(:,:,4,image_counter) = cur_image(:,:,4); 
            imdb.images.data(:,:,5,image_counter) = cur_image(:,:,5); 
            imdb.images.data(:,:,6,image_counter) = cur_image(:,:,6); 
            imdb.images.data(:,:,7,image_counter) = cur_image(:,:,7); 
            imdb.images.data(:,:,8,image_counter) = cur_image(:,:,8); 
            imdb.images.data(:,:,9,image_counter) = cur_image(:,:,9); 
            imdb.images.data(:,:,10,image_counter) = cur_image(:,:,10);

        end


        imdb.images.set(     1,image_counter) = set;             
        image_counter = image_counter + 1;
    end

1 Ответ

0 голосов
/ 09 мая 2018

Основная проблема здесь в том, что вы не можете назначить поля структуры внутри parfor так, как вы пытаетесь это сделать. Кроме того, ваши выходные данные должны быть проиндексированы с помощью переменной цикла, чтобы квалифицироваться как «нарезанный» - т.е. не использовать image_counter. Для этого вам понадобится что-то вроде:

% Make a numeric array to store the output.
data_out = zeros([image_size, 10, length(cur_images)]);

parfor i = 1:length(cur_images)
    cur_image = load(cur_images{i, :});
    cur_image=(cur_image.Image.crop);
    cur_image = imresize(cur_image, image_size);

    % Now, assign into 'data_out'. A little care needed
    % here.
    if rgb < 1
        data_tmp = zeros([image_size, 10]);
        data_tmp(:, :, 1) = cur_image;
    else
        data_tmp = cur_image;
    end
    data_out(:, :, :, i) = data_tmp;
end
imdb.images.data = data_out;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...