2013-11-02 68 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

很好地完成。我喜欢代码中的评论。非常感谢。 –