MATLAB bsxfun或矢量化

MATLAB bsxfun或矢量化,matlab,vectorization,sparse-matrix,bsxfun,Matlab,Vectorization,Sparse Matrix,Bsxfun,我一直在使用bsxfun对我的代码进行矢量化,但我遇到了一个无法完全破解的场景。这是一个问题的小例子。我想删除这段代码中的for循环,但我在使用tempEA行时遇到了困难 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]; aI

我一直在使用bsxfun对我的代码进行矢量化,但我遇到了一个无法完全破解的场景。这是一个问题的小例子。我想删除这段代码中的for循环,但我在使用tempEA行时遇到了困难

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

提前感谢您的帮助。

这使用了
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
N=numel(索引);
ii=bsxfun(@eq,dIndex',Index);%'//根据每个i选择的值
jj=bsxfun(@eq,aIndex',Index);%'//根据每个j选择的值
[igrid jgrid]=ndgrid(1:N);%//生成i和j的所有组合
match=double(ii(igrid(:),:)&jj(jgrid(:),:);%//每行包含(i,j)组合的匹配项
匹配(~match)=NaN;%//最小化时将不考虑这些条目
结果=分钟(bsxfun(@times,aTime,match.');%'//根据“匹配”的每一行最小化
结果=重塑(结果[N]);
结果(isnan(结果))=50;%//将NaN设置为50
结果