我沒有撞上這個問題而尋找這個話題,但是這一次似乎已經過時。
閱讀https://blogs.mathworks.com/loren/2016/10/24/matlab-arithmetic-expands-in-r2016b,隱式擴展是在2016b中引入的,但我仍然可以在bsxfun用于算術的論文中找到參考代碼擴張。所以我假設有一些情況bsxfun比其他方法更可取。
我比較之間的速度bsxfun,repmat以及隱式膨脹(I使用的Jonas的代碼從所述鏈路)
下面顯示了使用計算時間的比較tic toc:

這表明隱式擴展顯然比bsxfunor快repmat。現在有什么理由使用bsxfun嗎?
這是我用來比較速度的代碼:
n = 300;
k=100; %# k=100 for the second graph
a = ones(10,1);
rr = zeros(n,1);
bb = zeros(n,1);
ntt = 100;
tt = zeros(ntt,1);
for i=1:n;
r = rand(1,i*k);
for it=1:ntt;
tic,
x = bsxfun(@plus,a,r);
tt(it) = toc;
end;
bb(i) = median(tt);
for it=1:ntt;
tic,
y = repmat(a,1,i*k) repmat(r,10,1);
tt(it) = toc;
end;
rr(i) = median(tt);
for it=1:ntt;
tic,
z = a r;
tt(it) = toc;
end;
gg(i) = median(tt);
end
figure;
plot(bb,'b')
hold on
plot(rr,'r')
plot(gg,'g')
legend(["bsxfun","repmat","implicit"])
uj5u.com熱心網友回復:
所有bsxfun做的是乙inary小號ingletonê X潘申。它比現在通常的隱式擴展更具打字性。我猜想 MathWorks 保留bsxfun了向后兼容性,但不再適用于它;它甚至可能在內部只是映射到隱式擴展。
有關說明的檔案bsxfun:
建議您將大多數使用替換
bsxfun為對支持隱式擴展的函式和運算子的直接呼叫。與 using 相比bsxfun,隱式擴展提供了更快的執行速度、更好的記憶體使用率和更高的代碼可讀性。有關詳細資訊,請參閱基本操作的兼容陣列大小。
在nirvana-msu 的這個答案中可以找到更多有用的鏈接,其中包括 MathWorks 員工討論此問題的博客。
所以我會說,使用bsxfun而不是隱式擴展的唯一原因是,如果您在 2016b 之前的 MATLAB 版本上運行代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/365472.html
上一篇:如何更改url中的IP地址
下一篇:八度誤差條格式
