一行代碼能做什麼?|Mathematica十分鐘教程

一行代碼能做什麼?|Mathematica十分鐘教程

來自專欄 MathematicaLab

文章同時發表在我的微信公眾號:

丨折枝丨

微信搜索:complex-zyb

視頻

Bilibili:

【一行代碼能做什麼?】Mathematica用一行代碼打造炫酷程序_嗶哩嗶哩 (゜-゜)つロ 乾杯~-bilibili?

www.bilibili.com

https://www.zhihu.com/video/965715826708533248

更多學習資源

  • 我在集智AI學園上開設的課程(即將上線)

AI學園-AI極客?

campus.swarma.org

  • 知識星球:第一時間看到更新 / 在線答疑

https://t.zsxq.com/IIe2nIm?

t.zsxq.com

文稿


一行代碼能做什麼?

程序,都是由一行行的代碼編寫而成的。很多功能強大的軟體,背後都是上百萬、甚至上億行的代碼。所以,如果我問你,「一行代碼能做什麼」的時候,你很可能會回答:做不了什麼,無非就是輸出些文字而已。

但是,如果你熟悉Mathematica的話,你的回答很可能就變成了:可以做很多很多有意思的事情。

所以說,在程序領域,很多時候可以說「語言限制了你的想像力」。

語言限制了你的想像力

在2014年,Wolfram公司做了一項研究:比較不同語言處理同一項問題的時候,所需耗費的代碼量。在這項研究中,Mathematica表現驚人:

相對於Python的代碼量,Mathematica所需的代碼量,只是Python的平方根,再乘上一個係數!這就意味著,100行Python代碼所能完成的工作,Mathematica平均只需要35行就可以完成。而若代碼更長,比如說一萬行的Python代碼,Mathematica預計也只需要348行就可以完成!

所以說,語言限制了你的想像力。只要熟練使用Mathematica,你可以用三百多行的代碼,完成一萬行其他語言可以完成的工作。我自己曾經用十二行代碼,完成了1000行C++代碼的工作。那麼,一行呢?這就是今天的主題:一行代碼能做什麼?

一行代碼能做什麼?

Wolfram公司很早就開展了一項比賽:單行代碼大賽。參賽者只能使用一行代碼,去作儘可能有意思的東西。消耗的字母也是越少越好。

我們從簡單例子的開始,先看一個2010年的獲獎作品:大黃鴨

大黃鴨

它的邏輯非常簡單,就是找到一個特殊的函數,恰好就能繪出一個大黃鴨。這裡使用Spherical Plot 3D函數,繪製三維極坐標圖像。它的前三個參數分別是,極坐標函數,以及兩個參量的取值範圍。而後面的「選項」,則是這裡想要具體說明的東西。

首先,代碼將Boxed、Axes、Mesh都設為了False或None。這是為了去除圖中的無用元素。比如說,Boxed,就控制是否繪製邊框;Axes則控制是否繪製坐標軸;而Mesh則控制是否繪製網格線。這些都會干擾最後的圖像,所以要去除。

之後,則要關注輸出的風格。既然是大鴨,顏色就得是黃色。所以Plot Style要設置成Yellow。這樣就可繪製出黃色的鴨子。

最後,PlotPoints的選項,是用來控制採樣點數量的。採樣點越多,繪製出的函數也就越精細。所以,這裡將之設置為30,就是為了得到足夠精細的圖像。

下面我們來看第二個作品:微積分表

微積分表

我們在學習高等數學的時候,可能都查過《微積分表》,它對於我們手算微積分有很大的幫助。這個2010年的獲獎作品,就利用了Mathematica符號計算的優勢,自動枚舉函數,然後去構造一個《微積分表》。

微積分表的關鍵,是要能枚舉函數。而要枚舉函數,就要能拆分函數。反過來,只要我們能夠合併函數,就可以對特定形式的函數進行枚舉。Mathematica提供了Composition函數,專門用來複合函數。比如說,Composition f g,就會將f函數和g函數合併,在f里嵌套一個g函數。

可以合併函數之後,還要能窮舉各類函數出現的順序,也就是要能做全排列。我們使用Permutations函數,可以對一個序列中的元素進行全排列。比如這裡給出了六個基本的函數:根號、e指數、平方,等等。它從單個函數開始,一直枚舉三個函數的排列。這樣,再使用Composition,就可以自動生成很多不同的函數。

我們注意一下這裡有兩個符號,一個時井號(#),另一個時at(@)符號。單個的井號可以與and(&)符號構造一個匿名函數,比如說,井號、平方、and(#^2&),就是一個計算平方的函數。而兩個井號在一起,則用來表示一系列參數。比如Times[##]&[1,2,3,4],就相當於Times[1,2,3,4]。而at(@)符號,則是使用函數的簡便方法:比如說f@n,就相當於用n做參數來調用f。

最後,再在外邊用Grid,繪製一個表格,就可以得到一個積分表。

遞歸圖像

最後,再說一個「遞歸圖像」的作品。顧名思義,就是用圖像自身,重新組合為原圖像。它的思路非常簡單,就是先將圖像變為灰度圖。然後用修改了亮度的原圖,代替像素,得到一個拼合出的圖像。

所以,第一件事,就是要將圖像調整大小、拆分為像素。圖像如果太大,直接去拼合的話,最終的圖像會大得驚人。所以第一件事,就要用Image Resize來調整圖像的大小。並用Nest迭代函數,和Darker函數將圖像壓暗5倍。再用Rescale函數,把圖像的數值範圍從0~1,變為0~9,以便後面調整亮度。調整之後的圖像,存在i之中。

然後的工作,就是將0~9的數值,替換為不同亮度的原圖。這時,使用反斜杠加點的寫法,將所有的整數都替換為不同亮度的原圖。這裡用Nest函數對Lighter進行迭代,將圖像提亮到所需要的亮度。

最後,使用Image Assemble函數,將這個存儲著圖片的二維數組,拼合為一個大圖,就得到了一個「遞歸圖像」。

短就是生產力

在這裡我分享了三個「短代碼」,它們都只用了一行代碼,就做出了非常有意思的工作。那麼,「短」的意義在哪裡呢?我想說的是:短就是生產力。短代碼,意味著如果你對Mathematica很熟練的話,可以很快地完成一個項目。這節約了寫代碼的時間。而快速寫出代碼、快速檢查結果、快速迭代,則是進行創造力工作,所需要的能力。

試想一下,如果你想出了一個點子,細分下去,有十個不同的解決方案。使用Mathematica,你可能可以在一天之內,就將這十個方案都嘗試一遍。這個時候,面對如此少的工作時間,我們通常不會心生畏懼,而是去大膽嘗試。而大膽的嘗試,則是創造力工作的關鍵所在。


除了十分鐘的短課程,我還在「集智AI學園」中,開設了系統的教學課程,歡迎大家學習,網址放在了下面的簡介之中。大家也可以訂閱我在「知識星球」上的專欄,在第一時間看到分享的內容。同時,也可以與我進行交流。


推薦閱讀:

下面這個mathematica語句怎麼理解?
有哪些文檔適合指導新手用Mathematica排版文檔或書籍?
mathematica軟體是如何盈利的?
Mathematica還有哪些美麗的地方?
Mathematica中的Print怎麼能輸出時不換行?

TAG:WolframMathematica | 編程 | 自然科學 |