找到组间差异的重要值

时间:2013-10-04 09:14:59

标签: 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)) || (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   3
3   2   3]

表示对于第一次测量,第1组和第2组之间的差异是显着的,因为第3次测量显着是第1组和第3组之间以及第2组和第3组之间的差异。

1 个答案:

答案 0 :(得分:1)

您可以使用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

您可以在permute上应用DP来删除for循环,但不会有太多可读的代码。

相关问题