如何評價 MATLAB R2016b ?

R2016b -
對 MATLAB 和 Simulink 產品系列的更新

最大的亮點是什麼?

哪些新功能是你最想要的?

有什麼缺陷或陷阱?


補充: 評論區裡面 @Daniel Li 懷疑MATLAB自動對遞歸進行優化(演算法級別上的), 我做了一下實驗,將中間結果保存下來.如果速度與之前的差不多的話,說明確實如他所說,否則,就並沒有在演算法上進行優化.

function f = fib_cache(n)
res = NaN(n, 1);
res(1) = 1;
res(2) = 1;
f = fib(n);
function f = fib(n)
f = res(n);
if ~isnan(f)
return;
end
f = fib(n-1) + fib(n-2);
res(n) = f;
end
end

結果對比(都是在R2016a上):

&>&> timeit(@() fib_cache(30))
ans =
1.67568262789356e-05
&>&> timeit(@() fib(30))
ans =
0.153421004135249

明顯, MATLAB並沒有在遞歸程序中,自動保存下中間結果.

原文分割線

##############################################################################

1 維度自動擴展。
這個功能可以代替原先的bsxfun函數,當表達式較長時,bsxfun的可讀性較差。 但是方便的同時,也帶來了問題, 如果你原先不是想自動維數自動擴展的,只是不小心造成維數不同的,就不會自動報錯了,這是一個坑點。 比如你是想將兩個列向量相加,但是你忘了將其中一個轉置,從而造成實際是一個100長度的行向量與100長度的列向量相加, 結果生成了一個100乘100點矩陣,結果明顯不啊你想要的,如果長度更大,比如100萬,就會爆內存了。

比較了一下維度自動擴展與bsxfun的效率:

文檔裡面是這麼說的:

Previously, this functionality was available via the bsxfunfunction. It is now recommended that you replace most uses ofbsxfun with direct calls to the functions and operators that support implicit expansion. Compared to using bsxfun, implicit expansion offers faster speed, better memory usage, and improved readability of code.

實證代碼:

val1 = f(1e3);
val2 = g(1e3);
isequal(val1, val2)

timeit(@() f(1e3))
timeit(@() g(1e3))

function val = f(N)
a = 1:N;
b = a.";
val = a .* b + a + b;
end

function val = g(N)
a = 1:N;
b = a.";
val = bsxfun(@plus, b, bsxfun(@plus, a, bsxfun(@times, a, b)));
end

運行結果:

ans =

logical

1

ans =

0.0033

ans =

0.0051

說明結果一致, 維度自動擴展速度更快一些.

以往被大家強烈推薦的bsxfun將被替代了!

2 在腳本上寫函數。這個功能一直是我想要的,我是一個極簡主義者,希望一件事在一個文件里完成,但是之前的版本,我不得不在至少兩個文件里完成,一個測試文件,若干個函數文件。

1 和 2 的實驗例子:

生成一個腳本.裡面有一個局部函數, 功能是生成一個九九乘法表

val = f(9)

function val = f(N)
a = 1:N;
b = a.";
val = a .* b;
end

運行結果:

val =

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

檢驗腳本裡面的函數是否是局部函數:

Trial&>&> which f
未找到 "f"。

在命令窗口中沒有找到, 說明是局部函數.

3 多謝 @Falccm 的提醒, 我測試一下性能.代碼:

function [result,len_max] = euler014
len_max = 0;
result = 0;
for ii=1:1e6-1
n = ii;
len = 1;
while n~=1
if floor(n/2)*2 == n
n = n/2;
else
n = n*3+1;
end
len = len+1;
end
if len&>len_max
len_max = len;
result = ii;
end
end
disp(result);
end

在命令窗口中輸入

timeit(@() euler014())

在4個版本上的測試結果:

R2013a
3.465377

R2015b
2.4300518772012

R2016a
2.39071602418339

R2016b
1.4999

R2016b相比R2016a提速大概60%

測試了一個遞歸函數,代碼:

function f = fib(n)
if n &< 2 f = n; return else f = fib(n-1) + fib(n-2); end end

命令窗口:

timeit(@() fib(30))

結果對比:

R2013a
19.305586

R2015b
0.144366451933115

R2016a
0.144836810164018

R2016b
0.1007

R2016b相比R2016a提速了大約44%.

R2013a相比其他版本, 慢了兩個數量級!

所以說, 升級版本是提速MATLAB程序的有效手段之一!

4 命令窗口顯示更多的變數信息

When displaying output, the Command Window now adds a header that includes the class, size, and shape of a variable.

比如:在R2016b中,

Trial&>&> A

A =

包含以下欄位的 struct:

a: 1
b: 2

Trial&>&> B = cell(2,3)

B =

2×3 cell 數組

[] [] []
[] [] []

而在之前的版本中:

&>&> A
A =
a: 1
b: 2
&>&> B = cell(2,3)
B =
[] [] []
[] [] []

區別在於新版本多輸出了維度,類型等信息.

5 關於string的介紹

Introducing String Arrays

6 Workspace中字元型(char型)的圖標改了

原先是"abc",現在變成了"c|h"

string型是「str」

不定時更新。


總的來說,16b 給我們帶來了很多意想不到的驚喜,但驚喜之餘也略有不足。下面列舉一二 (不定期再做補充)

1. Functions in script(腳本里寫函數)

Functions in script 雖妙,卻不能像 functions in function 那樣完美支持原地函數調用的特性了,後者在原地調用時可以避免參數傳遞,性能大大優於在 script 里調用定義在script里的函數(或者在script 里調用獨立於script外的 M-file function)。

例如:functions in script,in-place 函數調用未能得到優化

clear
x = rand(1e8,1);
tic, y = notInplace(x); toc
tic, x = inplace(x); toc
isequal(x,y)

function y = notInplace(x)
y = 1.2*x;
end

function x = inplace(x)
x = 1.2*x;
end

結果如下:

Elapsed time is 0.193417 seconds.
Elapsed time is 0.278244 seconds.

ans =
logical
1


再看看 functions in function, in-place 函數調用得到自動優化

function main
x = rand(1e8,1);
tic, y = notInplace(x); toc
tic, x = inplace(x); toc
isequal(x,y)

function y = notInplace(x)
y = 1.2*x;

function x = inplace(x)
x = 1.2*x;

結果如下:

Elapsed time is 0.197968 seconds.
Elapsed time is 0.077954 seconds.

ans =
logical
1

2. Implicit Expansion (隱式擴展)

MATLAB R2016b 為所有 element-wise 的操作符提供了自動隱式擴展的功能,多數情況下(比如實數輸入),這種隱式擴展的效率高於 bsxfun。但對於複數輸入,尤其是非原地操作(或者首次操作時),經常會出現隱式擴展反而比 bsxfun 慢。例如,仍然以 @李海濤 的例子為例,只不過,將參與運算的實數換成複數,結果是 bsxfun 更快!

clear
timeit(@() f(3e3))
timeit(@() g(3e3))

function val = f(N)
a = rand(1,N)+1i*rand(1,N);
b = a.";
val = a .* b + a + b;
end

function val = g(N)
a = rand(1,N)+1i*rand(1,N);
b = a.";
val = bsxfun(@plus, b, bsxfun(@plus, a, bsxfun(@times, a, b)));
end

ans =

0.1226

ans =

0.0912


JIT性能改善非常大,腳本語言親測幾個函數,在非矩陣調用類函數,速度是多線程C++版本的1/2-1/3左右


圖像處理新增了superpixels及相關函數,算超像素十分方便


圖片處理的效果明顯優於之前的版本。而且,用print保存圖片的時候,上面的文字也保留的很好。


每一次升級安裝包就會越來越大


推薦閱讀:

c++ 臨時變數問題?
為什麼 Python 現在(2015年)越來越火了?
想提高編程能力,請大家評價這種學習方法是否可取?
考慮到未來人工智慧的發展,應該學習C++/C語言還是Python語言?
大學理科生零基礎自學計算機和編程有哪些書籍和方法比較好?

TAG:編程 | 數學軟體 | MATLAB | 科學計算 |