修改bsxfun以检查重要值

时间:2013-10-05 10:23:17

标签: matlab

我遇到了这个问题......在我的数据数组中查找组之间的重要值。 我的解决方案是:

Data = [1.8,1.4, 1.5;
60, 70, 80;
20, 40, 5];

Error = [0.2, 0.1, 0.4;
20, 30, 10;
10,5,2];

    k = 1; 

for i = 1: size(Data,1)

    if ((Data(i,1)-Error(i,1)) > (Data(i,2)+Error(i,2)))

      selectedpar(k,1:3) = [i ,1, 2];

      k = k+1;
    end

    if ((Data(i,1)-Error(i,1)) > (Data(i,3)+Error(i,3)))

      selectedpar(k,1:3) = [i , 1, 3];

      k = k+1;
    end

    if ((Data(i,2)-Error(i,2)) > (Data(i,3)+Error(i,3)))

      selectedpar(k,1:3) = [i , 2, 3];

      k = k+1;
    end

end

selectedpar = [1    1   2
3   1   3
3   2   3]

感谢用户,我来到了另一个通用解决方案(删除了一系列if条件)

DM = Data-Error;
DP = Data+Error;
selectedpar = [];
for k=1:size(Data,1)
   [I,J]=find(tril(bsxfun(@gt, DM(k,:), DP(k,:).')));
   selectedpar = [selectedpar ; k+zeros(size(I)), J, I];  %#ok<AGROW>
end

现在我想添加另一个条件:特别是如果我想检查

而不是单一条件
if ((Data(i,1)-Error(i,1)) > (Data(i,2)+Error(i,2)) || (Data(i,1)+Error(i,1)) < (Data(i,2)-Error(i,2))) etc...

所以我丑陋的解决方案将是

    k = 1; 

for i = 1: size(Data,1)

    if ((Data(i,1)-Error(i,1)) > (Data(i,2)+Error(i,2)) || (Data(i,1)+Error(i,1)) < (Data(i,2)-Error(i,2)) )

      selectedpar(k,1:3) = [i ,1, 2];

      k = k+1;
    end

    if ((Data(i,1)-Error(i,1)) > (Data(i,3)+Error(i,3)) || (Data(i,1)+Error(i,1)) < (Data(i,3)-Error(i,3)))

      selectedpar(k,1:3) = [i , 1, 3];

      k = k+1;
    end

    if ((Data(i,2)-Error(i,2)) > (Data(i,3)+Error(i,3)) || (Data(i,2)+Error(i,2)) < (Data(i,3)-Error(i,3)))

      selectedpar(k,1:3) = [i , 2, 3];

      k = k+1;
    end

end

selectedpar = [1    1   2
3   1   2
3   1   3
3   2   3]

(正确的解决方案)

如何修改bsxfun以添加新if条件的第二部分(OR之后的那部分)

谢谢

1 个答案:

答案 0 :(得分:0)

正如我在上一个问题的评论中所说:只需添加另一个bsxfun行,DMDP,并将@gt更改为@lt;然后使用另一个selectedpar = ...行收集结果:

DM = Data-Error;
DP = Data+Error;
selectedpar = [];
for k=1:size(Data,1)
   [I,J]=find(tril(bsxfun(@gt, DM(k,:), DP(k,:).')));
   selectedpar = [selectedpar ; k+zeros(size(I)), J, I];  %#ok<AGROW>
   [I,J]=find(tril(bsxfun(@lt, DP(k,:), DM(k,:).'))); %%%NEW LINE
   selectedpar = [selectedpar ; k+zeros(size(I)), J, I];  %#ok<AGROW> %%%NEW LINE
end