2016-02-12 215 views
1

我需要在MATLAB中使用parfor來編寫一個簡單的嵌套循環。骨骼的代碼是:Matlab parfor嵌套循環變量訪問

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

在此之後,我需要找到(對應的行數和列數)的矩陣A最大值。但是,該變量不能在parfor循環之外訪問。什麼是最簡單的方法來做到這一點?這對分類器的多個參數調整是必需的。

更新

這裏是確切的代碼:

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

我試過你的代碼並得到了同樣的錯誤。然後,我嘗試了下面的Daniel的代碼,它的工作。很明顯,用變量代替長度(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 

好,如果你想要極值和位置,你需要做更多的工作。儘管您不需要存儲整個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