2016-02-12 3 views
1

Мне нужно написать простой вложенный цикл цикла в MATLAB, используя parfor для внешнего цикла. Скелетной код:Matlab parfor доступ к вложенным переменным цикла

parfor i=1:M 
    for j=1:N 
     A(i,j)=myFunction(i,j); 
    end 
end 

После этого мне нужно найти максимальное значение в матрице A (соответствующий номер строки и столбца). Однако эта переменная недоступна вне цикла parfor. Каков самый простой способ сделать это? Это требуется для настройки нескольких параметров для классификатора.

Update

Вот точный код:

C1=[0.001;100]; C2=[0.001;100]; 

A=zeros(length(C1),length(C2)); 

parfor i=1:length(C1) 
    for j=1:length(C2) 
    A(i,j)=2*i-3*j; 
    end 
end 

[max_num,max_idx] = max(A(:)); %finding maximum element 
[X Y]=ind2sub(size(A),max_num); %retrieving location of max element 

% Need to use these values 
bestC=C1(X) 
bestD=C2(Y) 

poolobj = gcp('nocreate'); 
delete(poolobj); 

Это дает ошибку:

Error: The variable A in a parfor cannot be classified. 
+2

A должен быть доступен за пределами parfor после завершения цикла. Я просто проверил это, заменив ваш внутренний оператор на A (i, j) = i * M + j * N; Какую ошибку вы получаете, когда пытаетесь получить к ней доступ? – Herb

+0

Я изменил вопрос, чтобы добавить код и ошибку. Пожалуйста, смотрите. – Sumit

+0

Я пробовал ваш код и получил ту же ошибку. Затем я попробовал код Дэниела ниже, который работал. Так ясно, что замена длины (C1) и длины (C2) переменными решает проблему. – Herb

ответ

1

Незначительные изменения и Matlab в состоянии понять ваш код.

C1=[0.001;100]; C2=[0.001;100]; 
n=length(C1); 
m=length(C2); 
A=zeros(n,m); 

parfor i=1:n 
    for j=1:m 
    A(i,j)=2*i-3*j; 
    end 
end 

[max_num,max_idx] = max(A(:)); %finding maximum element 
[X Y]=ind2sub(size(A),max_num); %retrieving location of max element 

% Need to use these values 
bestC=C1(X) 
bestD=C2(Y) 

poolobj = gcp('nocreate'); 
delete(poolobj); 
+0

Спасибо! работает сейчас – Sumit

0

Если все, что вы хотите, это минимальное значение A, вам не нужно хранить все элементы - parfor понимает сокращение как min, так что-то вроде это работает:

A = Inf; 
parfor i=1:M 
    for j=1:N 
     A = min(A, rand); 
    end 
end 

Ok , если вы хотите экстремальное значение и местоположение, вам нужно сделать немного больше работы. Вам не нужно хранить все A, хотя вы все равно можете это обозначить как уменьшение parfor.

function Axy = pfeg 

% Axy contains the running maximum value of A, and the location 
% where it was found. Initialize it with default values: 
Axy = {-Inf, -1, -1}; 
parfor i=1:10 
    for j=1:10 
     % calculate the new value of "A(i,j)" 
     tmp = rand(); 
     % Update the running maximum 
     Axy = iReduce(Axy, {tmp, i, j}); 
    end 
end 
end 

function axy = iReduce(axy, candidate) 
if candidate{1} > axy{1} 
    axy = candidate; 
end 
end 
+0

Я не уверен, что это сделало бы то, что я хочу. Я редактировал вопрос, чтобы добавить код и ошибку. – Sumit