NaN Infについて

10 views (last 30 days)
sz
sz on 1 Dec 2021
Answered: Atsushi Ueno on 1 Dec 2021
現在、下記のような計算をしたいと思っています。
data10は18×231250の行列となっており中身は全て0か1のみの数になっています。
その後に
10進数変換をします
例101の場合  (2×1)の0乗+0+(2×1)の2乗
 111の場合  (2×1)の0乗+(2×1)の1乗+(2×1)の2乗
このような計算を行って231250こ足し合わせて1×18行列にします(data11)
その後にSCEの計算を行います。(下記スクリプト参照)
しかしNaNやInfというのがdataの中に入ってきPの値が0になってしまいます。
どのようにすれば良いのかスクリプトを送っていただけると助かります。
よろしくお願いいたします。
data10=data9.*2.^(0:231249);
data10tenchi=data10.'
data11=sum(data10tenchi,'omitnan');
%hist(data10);
for i = 0:18
P(i+1)=sum(data11==i)/numel(data11);
end
SCE = sum(-1.*P.*log2(P),'omitnan')
SCE1=SCE/18
  2 Comments
Atsushi Ueno
Atsushi Ueno on 1 Dec 2021
2の231250乗はdouble型の最大値1.797693e+308を超える天文学的な数値になる為、Infになってしまいます。
文字でシンボリックに計算する方法を使えばやりたい事が出来ます。
ただ巨大な整数はもはや数としてではなく文字列として扱わなければならないので面倒です。
Symbolic Math Toolboxがあれば数を文字や数式として扱えるのでその点便利に処理してくれます。
Atsushi Ueno
Atsushi Ueno on 1 Dec 2021
Edited: Atsushi Ueno on 1 Dec 2021
これを使ってdata9 = vpi(randi(2,[18 231250])-1)とdata10 = data9.*2.^(0:231249);を計算させてみましたが、永遠に終わりそうにありません。中身を熟知し計算のさせ方を工夫しないと、目的の計算を早く実行する事が出来ません。

Sign in to comment.

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 1 Dec 2021
上記ツールボックスを使って、231250個までは無理でしたが数千個なら1分以内で計算できる事を確認しました。
tic;
n = 3000; % 231250は死
data9 = randi(2,[18 n]) - 1; % 0と1の行列を作る
data11 = data9 * vpi(2) .^ (0:n-1)' % 行列に2のn乗を掛けて足す
%hist(data10);
for i = 0:18
P(i+1)=sum(data11==i)/numel(data11);
end
SCE = sum(-1.*P.*log2(P),'omitnan')
SCE1=SCE/18
toc
このライブエディタでは実行しませんでしたが、結果の一部を表示しておきます。3000桁の時点で既にとんでもない事になっています。
66514840503250955267060557899418863760396332944769610843343375769310
644013964493868419159321032610421952144659226860819952075071392023032236
654211666208501273013865082439662920590960816695045141428783695078247178
697177864671821082922648514702034887651650870736512375365936233477677890
118055359000785866504556032733634812758165957669818872920744793707647178
341864095294439204523869024490943846087715487564336437229976712562208927
944747835954480283709321580190901899093270982772323276049781216052151029
544918835596975816975916247892259684939174914403996350786074106435164556
698311624465287865605109417556166712073876177260319658681807981688491941
090307620601875463683319237887332968298141052740034282395162085351180725
083487344959483081247251148053557962289984908966705373445010924389800244
169463101696898880782206561154708820425918078917496752098711454384844863
951550195420880024651149788301958451222333
SCE =
0
SCE1 =
0
経過時間は 19.446537 秒です。

More Answers (0)

Categories

Find more on 数値型 in Help Center and File Exchange

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!