-1

だからここに私のサンプルデータがあります:

Arr StarP:
2141865 16
2141865 17
2141865 17
2141865 16
2141865 17
2141865 20
2141865 9
2141865 7
2141865 19
2141865 18
2141865 19
2141865 9
2141865 9
2141865 9
2141865 9
Arr medians:
2141865 16

目標は、Arr StarP を Arr 中央値と比較し、Arr StarP の対応する ID (2141865) を持つ値が Arr 中央値のその ID の値の特定の範囲内にあるかどうかを調べることです (1.5 倍大きいか 1.5 倍小さい場合)。 )、そうでない場合は、1.5 で乗算または除算する必要があります。Arr StarP の値が Arr 中央値よりも 2* 大きいか小さい場合、新しい平均計算でその値を無視します。

出力例:

2141865 14.00666667

PS Arr B の実際のサイズは 198x2 で、Arr A は 45879x2 です。Arr A には多くの異なる ID が含まれており、Arr B には正確に 198 があります。 ID とその中央値を ID とともに出力します。

4

1 に答える 1

1
function [medians, newAverage] = Medians_Koi(StarData, R, M)

    %//R is this range outside of which values must be multiplied. I'm assuming it's expressed in terms of the median, so for example if R is [0.8, 1.2] and the median is 10 then the range allowed is 8 - 12.
    %//M is what to multiply by (this really should have been explained in the question)

    %//why are you doing this with global and evalin?? This is really really bad practice and there is no reason for it. Just make the function accept input arguments and output output arguments
    %//StarData = evalin('base', 'StarP');
    %//global medians;
    %//global newAvg;

    StarData2 = StarData;

    [IDs, ~, Groups_1] = unique(StarData(:,1),'stable');
    medians = [IDs, accumarray(Groups_1, StarData(:,2), [], @median)];

    for g = 1:size(Group_1,1)
        toMultiply = (StarData(:,1)==IDs(g)) & (StarData(:,2) < medians(g)*R(1));
        toDivide = (StarData(:,1)==IDs(g)) & (StarData(:,2) > medians(g)*R(2));
        StarData2(toMultiply,2) = StarData(toMultiply,2) .* M(1);
        StarData2(toDivide,2) = StarData(toDivide,2) ./ M(2);
    end

    newAverage = [IDs, accumarray(Groups_1, StarData2(:,2), [], @mean)];

end
于 2013-10-22T06:34:15.550 に答える