2013-11-02 38 views
4

我一直在使用bsxfun工作向量化我的代碼,但是我遇到了一個我無法完全破解的場景。這是一個小問題的例子。我想刪除這段代碼中的for循環,但是我對tempEA行很困難。MATLAB bsxfun或矢量化

Index = [2; 3; 4;]; 

dTime = [25; 26; 27; 28; 25; 26; 27; 28; 27; 28]; 
dIndex = [3; 3; 3; 2; 1; 3; 2; 4; 4; 2]; 
aTime = [30; 38; 34; 39; 30; 38; 34; 39; 34; 39]; 
aIndex = [4; 2; 5; 4; 5; 4; 4; 2; 2; 4]; 

EA = zeros(numel(Index)); 
for i = 1:numel(Index) 
    for j = 1:numel(Index) 
     tempEA = aTime(Index(i) == dIndex(:,1) & Index(j) == aIndex(:,1)); 
     if i == j 
     elseif tempEA > 0 
      EA(i,j) = min(tempEA); 
     else 
      EA(i,j) = 50; 
     end 
    end 
end 

答案應該是這樣的:

EA = 

    0 50 34 
    38  0 30 
    34 50  0 

感謝您的幫助提前。

回答

2

這使用bsxfun;沒有循環。它假定您的aTime值中沒有NaN

N = numel(Index); 
ii = bsxfun(@eq, dIndex.', Index); %'// selected values according to each i 
jj = bsxfun(@eq, aIndex.', Index); %'// selected values according to each j 
[ igrid jgrid ] = ndgrid(1:N); %// generate all combinations of i and j 
match = double(ii(igrid(:),:) & jj(jgrid(:),:)); %// each row contains the matches for an (i,j) combination 
match(~match) = NaN; %// these entries will not be considered when minimizing 
result = min(bsxfun(@times, aTime, match.')); %'// minimize according to each row of "match" 
result = reshape(result,[N N]); 
result(isnan(result)) = 50; %// set NaN to 50 
result(result<=0) = 50; %// set nonpositive values to 50 
result(1:N+1:end) = 0; %// set diagonal to 0 

result(result<=0) = 50;只需要,如果你的aTime可以包含非正數值。它可以?或者,您的elseif tempEA > 0只是檢查tempEA不是空的方法嗎?

+0

很好地完成。我喜歡代碼中的評論。非常感謝。 –