2012-04-26 11 views
3

スレッシュホールド(0.5ではなく)を超えていれば丸められ、それ以外の場合は丸められます。カスタム・スレッショルドで数値を丸める

ここに私が思いついたコードがあります。これは、またはより洗練されたソリューション(おそらくベクトル化された)のためのmatlabの関数が組み込まれていますか?

function [ rounded_numbers ] = custom_round(input_numbers, threshold) 
%CUSTOM_ROUND rounds between 0 and 1 with threshold threshold 

    [input_rows, input_cols] = size(input_numbers); 
    rounded_numbers = zeros(input_rows, input_cols); 

    for i = 1:length(input_numbers) 
    if input_numbers(i) > threshold 
     rounded_numbers(i) = 1; 
    else 
     rounded_numbers(i) = 0; 
    end 
    end 
end 

おかげ

答えて

1

ここ数がしきい値

in = [0.2,-3.3,4.1]; 
th = 0.2; 

%# get the fractional part of the number 
frac = mod(in,1); %# positive for negative in 

%# find the sign so we know whether to round 
%# to plus or minus inf 
sig = sign(in); 

%# identify which way to round 
upIdx = frac>th; %# at threshold, we round down 

%# round towards inf if up 
out = abs(in); 
out(upIdx) = ceil(out(upIdx)); 
out(~upIdx) = floor(out(~upIdx)); 
%# re-set the sign 
out= out.*sig 
out = 
0 -4  4 

注意を経過した場合、我々はゼロから丸めるソリューションです:数字のみを0と1の間にある場合、それはさらに簡単ですが:

+0

wow私はばかです。ありがとう – waspinator

+0

@waspinator:常に助けてくれてうれしいです:P – Jonas

1

これは、0と1の間ではなく、任意の数値で有効です。しきい値は、 [0,1]の範囲内にある。

私は負の数でテストしていません。

function [result] = custom_round(num, threshold) 

if (threshold < 0) || (threshold >= 1) 
    error('threshold input must be in the range [0,1)'); 
end 

fractional = num - floor(num); 
idx1 = fractional > threshold; 
idx2 = fractional <= threshold; 
difference = 1 - fractional; 
result = num + (difference .* idx1) - (fractional .* idx2); 

end 

テスト

>> custom_round([0.25 0.5 0.75 1], 0.3) 
ans = 
    0  1  1  1 

>> custom_round([0.25 0.5 0.75 1], 0.8) 
ans = 
    0  0  0  1 

>> custom_round([10.25 10.5 10.75 11], 0.8) 
ans = 
    10 10 10 11 
+0

ここでのリスクは、出力が整数ではないことです。これは、ラウンド時に期待するものです。 – Jonas

5

だけ

round(x-treshold+0.5) 

テストケースを使用します。

>> x = -10:0.3:10 
ans = 
    -2 -1.7 -1.4 -1.1 -0.8 -0.5 -0.2 0.1 0.4 0.7 1 1.3 1.6 1.9 


>> treshold = 0.8; % round everything up for which holds mod(x,1) >= treshold 
>> y = round(x-treshold+0.5) 

ans = 
    -2 -2 -2 -1 -1 -1 -1  0  0  0  1  1  1  2 

負の数は、境界上を除いて、正確に丸められます:-0.8が丸めます0ではなく-1に設定しますが、 round(-0.5)は-1を返します。