假设我是一个向量,其中行表示测量的平均值,列表示一组人。
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)) || (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
我的问题是我事先不知道我应该使用的 if 条件的数量(组号不固定(......有没有办法用通用解决方案解决这个问题?此示例中的结果将是
selectedpar = [1 1 2
3 1 3
3 2 3]
表明对于第一次测量,组 1 和 2 之间的差异是显着的,对于第三次测量是显着的,组 1 和 3 之间以及组 2 和 3 之间的差异是显着的。
您可以使用
bsxfun
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
您可以通过在DP
上应用 permute
来删除 for 循环,但代码的可读性不高。