標籤:

請問Matlab如何計算大整數?比如 1000! ?

1.為什麼factorial(1000)顯示inf,怎麼這麼大的數就算不了么?

2.MATLAB如何處理大整數或浮點數的運算,有沒有成熟的方法?比如C介面或者toolbox之類?


@摘星子

如果要在 MATLAB 裡邊算調用符號計算的話:

expand(factorial(sym(1000)))

不加 expand 會保留 1000! 的形式,但是不影響後續計算,畢竟 1000! 這個結果多數時候比一長串數字更有意義

另外可以在 MATLAB 中執行:mupad,打開 mupad 之後計算,寫起來會方便些

除此之外可以在 MATLAB 中調用 python (需要自己安裝 python),或者 java(MATLAB 內置),或者 C# (僅限 windows 平台),用這些語言的大整數計算

如果是非整數的話,符號計算工具箱裡邊的 vpa,或者直接在 mupad 中算

也有第三方的工具箱提供這種能力,例如:

Multiprecision Computing Toolbox for MATLAB

你想用 C 當然也可以,比方說你可以用 C 調用 The GNU MP Bignum Library 之後編譯為 mex 函數在 MATLAB 中調用


這種事情還是交給專業的來好了

mathematica


使用第三方工具包:Variable Precision Integer Arithmetic

Variable Precision Integer Arithmetic

&>&> factorial(vpi(1000))
ans =
40238726007709377354370243392300398571937486421071463254379991042993
851239862902059204420848696940480047998861019719605863166687299480855890
132382966994459099742450408707375991882362772718873251977950595099527612
087497546249704360141827809464649629105639388743788648733711918104582578
364784997701247663288983595573543251318532395846307555740911426241747434
934755342864657661166779739666882029120737914385371958824980812686783837
455973174613608537953452422158659320192809087829730843139284440328123155
861103697680135730421616874760967587134831202547858932076716913244842623
613141250878020800026168315102734182797770478463586817016436502415369139
828126481021309276124489635992870511496497541990934222156683257208082133
318611681155361583654698404670897560290095053761647584772842188967964624
494516076535340819890138544248798495995331910172335555660213945039973628
075013783761530712776192684903435262520001588853514733161170210396817592
151090778801939317811419454525722386554146106289218796022383897147608850
627686296714667469756291123408243920816015378088989396451826324367161676
217916890977991190375403127462228998800519544441428201218736174599264295
658174662830295557029902432415318161721046583203678690611726015878352075
151628422554026517048330422614397428693306169089796848259012545832716822
645806652676995865268227280707578139185817888965220816434834482599326604
336766017699961283186078838615027946595513115655203609398818061213855860
030143569452722420634463179746059468257310379008402443243846565724501440
282188525247093519062092902313649327349756551395872055965422874977401141
334696271542284586237738753823048386568897646192738381490014076731044664
025989949022222176590433990188601856652648506179970235619389701786004081
188972991831102117122984590164192106888438712185564612496079872290851929
681937238864261483965738229112312502418664935314397013742853192664987533
721894069428143411852015801412334482801505139969429015348307764456909907
315243327828826986460278986432113908350621709500259738986355427719674282
224875758676575234422020757363056949882508796892816275384886339690995982
628095612145099487170124451646126037902930912088908694202851064018215439
945715680594187274899809425474217358240106367740459574178516082923013535
808184009699637252423056085590370062427124341690900415369010593398383577
793941097002775347200000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000


真巧,今天在學習Mathematics的時候碰到過這個問題,Mathematics計算階乘超級快,樓主可以試試。

Matlab中的數一律用雙精度格式存儲,其範圍一般而言已經足夠了,但也有例外的時候,比如說計算200以上大數的階乘。

Mathematics擅長符號計算,Matlab擅長數值計算。下面給出Matlab計算階乘的幾個方法:

1: factorial( )函數

&>&>
factorial(4)

ans
= 24

4!=4*3*2*1=24

2:借用Gamma函數的性質,當n為正整數時,gamma(n+1)=n!

&>&>
gamma(5)

ans
= 24

gamma(N)=(N-1)*(N-2)*...*2*1

3:prod( )函數 prod函數用於求數組元素的乘積

&>&> A=1:1:100;

&>&> prod(A)

ans =

9.3326e+157

還可以用它求雙階乘:

&>&> prod(1:2:7)

ans =

105

4.編寫M文件也是可以的...

BUT,以上方法只適合小數階乘,碰到大數階乘就inf歇菜了...So,Matlab裡面有個Maple引擎用來符號計算的,可以借用符號計算實現大數階乘:

&>&>
s="4!"

s =4!

&>&>
vpa(s)

ans =24.

&>&> factorial(365)

ans =

Inf

&>&> simple(sym("365!"))

simplify:

25104128675558732292929443748812027705165520269876079766872595193901106138220937419666018009000254169376172314360982328660708071123369979853445367910653872383599704355532740937678091491429440864316046925074510134847025546014098005907965541041195496105311886173373435145517193282760847755882291690213539123479186274701519396808504940722607033001246328398800550487427999876690416973437861078185344667966871511049653888130136836199010529180056125844549488648617682915826347564148990984138067809999604687488146734837340699359838791124995957584538873616661533093253551256845056046388738129702951381151861413688922986510005440943943014699244112555755279140760492764253740250410391056421979003289600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

這裡省略了一部分輸出..

simple( )這種表現形式很不好,改用極限的形式試一下:

&>&> syms x;

&>&> limit("x+365!",x,0)

ans =

25104128675558732292929443748812027705165520269876079766872595193901106138220937419666018009000254169376172314360982328660708071123369979853445367910653872383599704355532740937678091491429440864316046925074510134847025546014098005907965541041195496105311886173373435145517193282760847755882291690213539123479186274701519396808504940722607033001246328398800550487427999876690416973437861078185344667966871511049653888130136836199010529180056125844549488648617682915826347564148990984138067809999604687488146734837340699359838791124995957584538873616661533093253551256845056046388738129702951381151861413688922986510005440943943014699244112555755279140760492764253740250410391056421979003289600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

&>&> whos

Name Size Bytes Class Attributes

ans 1x1 1682 sym

x 1x1 126 sym

可以看出,這裡ans是一個sym型值,且並不能轉換為double值:

&>&> str2double(ans)

ans =

NaN

還是藉助Maple引擎計算,這麼表示也可以:

&>&> s="365!";

&>&> vpa(s)

ans =

2.5104128675558732292929443748812*10^778

&>&> str2double(ans)

ans =

NaN

以上三種表示方式核心都是借用Maple引擎計算求解,但是這裡ans是一個sym型值,且並不能轉換為double值

所以,廢話幾句:其實Mathematica在這方面NB多了,又快又精確:


就一行語句:

factorial(sym(1000))

但是失敗了


高精度計算MATLAB真的也可以!只需要使用符號計算功能即可。

本人在MATLAB 2012b和2015b上調試通過。

syms n
n=sym(1:1000);
prod(n)

結果如下:

402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


推薦閱讀:

為什麼招程序員不考慮MATLAB技能?
各位大神,請問如何用matlab證明人耳對聲音的相位不敏感?
請通俗易懂地解釋一下guidata()的用法?以及他是如何幫助參數在GUI間傳遞的?
Matlab畫圖增加右邊坐標軸的刻度,與左邊一樣,如何處理?
請問怎麼用matlab 畫一個傾斜的橢球?

TAG:MATLAB |