如何評價 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 Arrays6 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
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.1226ans = 0.0912JIT性能改善非常大,腳本語言親測幾個函數,在非矩陣調用類函數,速度是多線程C++版本的1/2-1/3左右
圖像處理新增了superpixels及相關函數,算超像素十分方便
圖片處理的效果明顯優於之前的版本。而且,用print保存圖片的時候,上面的文字也保留的很好。
每一次升級安裝包就會越來越大
推薦閱讀:
※c++ 臨時變數問題?
※為什麼 Python 現在(2015年)越來越火了?
※想提高編程能力,請大家評價這種學習方法是否可取?
※考慮到未來人工智慧的發展,應該學習C++/C語言還是Python語言?
※大學理科生零基礎自學計算機和編程有哪些書籍和方法比較好?