我遇到了这个问题......在我的数据数组中查找组之间的重要值。 我的解决方案是:
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之后的那部分)
谢谢
答案 0 :(得分:0)
正如我在上一个问题的评论中所说:只需添加另一个bsxfun
行,DM
和DP
,并将@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