2013-10-05 1 views
0

У меня была эта проблема ... т. Е. чтобы найти значимые значения между группами в моем массиве данных. Мое решение было:изменить bsxfun для проверки значимых значений

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] 

Благодаря пользователем я пришел к этому другому общее решение (удален ряд, если условия)

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 добавить вторую часть нового, если условие (тот после OR)

благодаря

+0

Я не уверен, об изменении Tril в triu вычислить также другой, если – gabboshow

ответ

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 
Смежные вопросы