4

数値がしきい値 (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

ありがとう

4

3 に答える 3

12

ただ使う

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 と同じ動作です: round(-0.5) は -1 を返します

于 2012-04-27T11:57:16.867 に答える
2

数値がしきい値を超えた場合にゼロから四捨五入するソリューションを次に示します。

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 の間のみの場合は、さらに簡単です。

%# this does exactly what your code does
out = double(in>th);
于 2012-04-26T22:11:21.477 に答える
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
于 2012-04-26T22:44:32.637 に答える