分布の分析を行うために基本的に数値の最初の桁を要求するバージョンのベンフォードの法則( http://en.wikipedia.org/wiki/Benford%27s_law )を実装したいと思います。
1934---> 1
0.04 ---> 4
-56 ---> 5
これをMATLABでどのように行いますか?
分布の分析を行うために基本的に数値の最初の桁を要求するバージョンのベンフォードの法則( http://en.wikipedia.org/wiki/Benford%27s_law )を実装したいと思います。
1934---> 1
0.04 ---> 4
-56 ---> 5
これをMATLABでどのように行いますか?
function res = first_digit(number)
number = abs(number);
res = floor(number / (10 ^ floor(log10(number))));
end
これはすべての実数で機能します(極端な場合はgnoviceのコメントを参照してください)
これを行うことができるいくつかの方法...
REGEXPの使用:
wholeNumber = 1934; %# Your number
numberString = num2str(wholeNumber,16); %# Convert to a string
matches = regexp(numberString,'[1-9]','match'); %# Find matches
firstNumber = str2double(matches{1}); %# Convert the first match to a double
ISMEMBERの使用:
wholeNumber = 0.04; %# Your number
numberString = num2str(wholeNumber,16); %# Convert to a string
isInSet = ismember(numberString,'123456789'); %# Find numbers that are
%# between 1 and 9
numberIndex = find(isInSet,1); %# Get the first number index
firstNumber = str2double(numberString(numberIndex)); %# Convert to a double
編集:
このトピックに関するいくつかの議論は、MathWorksブログの1つで発生しました。いくつかの興味深い追加ソリューションがそこで提供されています。提起された問題の1つは、ベクトル化されたソリューションがあることでした。そこで、私が思いついた1つのベクトル化されたバージョンを次に示します。
numberVector = [1934 0.04 -56];
numberStrings = cellstr(num2str(numberVector(:),16));
firstIndices = regexp(numberStrings,'[1-9]','once');
firstNumbers = cellfun(@(s,i) s(i),numberStrings,firstIndices);
log10 と floor 組み込み関数を使用して、
floor(x./10.^floor(log10(x)))
配列内のすべての要素の最初の桁も返します。
別の文字列ベースのソリューションを追加しましょう (同様にベクトル化):
FirstDigit = @(n) sscanf(num2str(abs(n(:)),'%e'), '%1d', numel(n));
ここに記載されているケースでテストされています:
>> FirstDigit( [1934 0.04 -56 eps(realmin)] )
ans =
1
4
5
4