2013-03-05 438 views
1

我的代碼段作爲parfor goind的Matlab「Assertion Failed」錯誤?

display('Descriptor Extraction...'); 

DESCRIPTORS = {}; 
descriptor_for_each_class = {}; 
num_classes = length(imgs_dir); 
IMAGES = {}; 
for i = 1:num_classes 
    class_name = classes{i}; 
    fprintf('Feature Extraction for CLASS %s\n',class_name); 
    full_path = fullfile(imgs_path,class_name); 

    class_dir = dir(full_path); 
    image_names = {class_dir(3:length(class_dir)).name}; 
    num_imgs = length(image_names); 

    descriptors = {}; 
    parfor j = 1:num_imgs 
     image_name = image_names{j}; 
     %fprintf('Feature Extraction for IMAGE %d/%d\n',j,num_imgs); 
     img_path = fullfile(full_path,image_name); 
     I = imread(img_path(:,:)); 
     I = standarizeImage(I); 
     I = rgb2gray(I) ; 
     IMAGES{i,j}.I = I; 
     IMAGES{i,j}.class_name = class_name; 
     IMAGES{i,j}.name = image_name; 
     [f, d] = vl_dsift(I, 'size', binSize) ; 
     descriptors{j}=d; 
    end 
    DESCRIPTORS = [DESCRIPTORS descriptors]; 
end 

當PARFOR部分完成的一個時代,在第二個時期的開始Matlab的給出了以下錯誤:

Error using parallel_function (line 589) 
Assertion failed. 

Error in feat_extraction (line 34) 
    parfor j = 1:num_imgs 

我不能上找到的bug代碼。有什麼想法嗎?

+1

可以最大限度地減少在這兩個循環的代碼,仍然能夠重現錯誤的問題? – 2013-03-05 14:33:47

回答

2

我解決了通過改變PARFOR部分如下

descriptors = {}; 
    images = {}; 
    parfor j = 1:num_imgs 
     image_name = image_names{j}; 
     %fprintf('Feature Extraction for IMAGE %d/%d\n',j,num_imgs); 
     img_path = fullfile(full_path,image_name); 
     I = imread(img_path(:,:)); 
     images{j}.I = I; 
     images{j}.class_name = class_name; 
     images{j}.image_name = image_name; 
     I = standarizeImage(I); 
     I = rgb2gray(I) ; 
     %IMAGES{i,j}.name = image_name; 
     [f, d] = vl_dsift(I, 'size', binSize) ; 
     descriptors{j}=d; 
    end 
    ALL_DATA{i}=images; 
    DESCRIPTORS = [DESCRIPTORS descriptors]; 
end 
+2

問題的原因是什麼? – 2013-03-05 14:45:47

+1

我正在使用的索引,從外循環的我,所以當我的價值改變其他matlab實例有parfoor內IMAGES索引問題。 – erogol 2013-03-05 19:44:43

+4

我在parfor中得到了這個錯誤,因爲我忘記了預初始化我的一個輸出數組,所以如果一個worker在另一個完成的迭代n之前完成迭代n + 1,它不能動態調整數組的大小。 Preinit固定它當然,這個答案給了我提示 - 完全不同的問題空間,但類似的結構。 – xenoclast 2015-03-25 16:47:58

相關問題