罗兰关于MATLAB的艺术gydF4y2Ba

将想法转化为MATLABgydF4y2Ba

隐式扩展对性能的重要性gydF4y2Ba

有时人们说他们喜欢用MATLAB,因为它很容易表达他们的数学思想。有时他们会为了表现而切换到另一种语言。虽然在MATLAB的早期历史中,这有时是有益的,但现在已经不那么明显了。让我们举个例子gydF4y2Ba隐式的扩张gydF4y2Ba(也gydF4y2Ba在这里gydF4y2Ba).gydF4y2Ba

为了最大化隐式展开的好处,最好使用一个更复杂、计算成本更高的表达式供MATLAB使用,同时尽量减少对临时数组的需要。MATLAB可以利用粗粒度并行性。但这也取决于您的计算机和您所使用的数组大小。而且值得考虑代码维护(为将来考虑)及其复杂性/简单性。gydF4y2Ba

内容gydF4y2Ba

示范gydF4y2Ba

下面就是这个简单想法的演示。我正在测试等价的数值算法来移除任何数组的均值并对其进行缩放。下面是MATLAB中的三个等效实现,最后一个将一个可能的临时数组嵌入到一行中,以充分利用最神奇的可能。第一个使用了有名的gydF4y2BabsxfungydF4y2Ba函数。第二个方法使用与第一个相同的步骤,但是使用了隐式扩展。第三种方法结合了其中的一些步骤,所以整体语句更少。我觉得这个很聪明。gydF4y2Ba

N = [300, 1000, 3000, 10000];任何时候= 0(长度(n), 4);gydF4y2Ba%alltimes = table("size", [length(n),4],…gydF4y2Ba%”VariableNames”,“n”、“bsxfun”、“隐”,“智能”));gydF4y2Ba为gydF4y2Bai = 1:length(n) runtimes = testRemoveMeanAndScale(n(i));Alltimes (i,:) = [n(i), runtimes];gydF4y2Ba结束gydF4y2Ba格式gydF4y2Ba短gydF4y2BaggydF4y2Ba全时工作的= array2table(任何时候,gydF4y2Ba“VariableNames”gydF4y2Ba, (gydF4y2Ba“n”gydF4y2Ba,gydF4y2Ba“bsxfun”gydF4y2Ba,gydF4y2Ba“隐式”gydF4y2Ba,gydF4y2Ba“智能”gydF4y2Ba])gydF4y2Ba
alltimesT = 4×4 table n bsxfun隐式智能_____ __________ __________ __________ 300 0.00024632 0.00014821 7.5306e-05 1000 0.00322 0.0036559 0.0027499 3000 0.030063 0.036868 0.027908 10000 0.3469 0.38712 0.33361gydF4y2Ba

的想法gydF4y2Ba

您可以看到时间不是完全一致的。似乎随着数组的增大,智能算法的性能始终优于其他算法。隐式扩张和gydF4y2BabsxfungydF4y2Ba除了小的矩阵大小之外,它们通常是相等的,可能额外的函数调用的代价足够大,所以很明显。gydF4y2Ba

你更喜欢哪种代码,为什么?gydF4y2Ba

我想知道你更喜欢哪种编码,我很想听听你的理由。请让我知道gydF4y2Ba在这里gydF4y2Ba.gydF4y2Ba

% %测试函数gydF4y2Ba函数gydF4y2Ba运行时= testRemoveMeanAndScale (n)gydF4y2Ba这个函数测试我们希望比较的三种算法的运算速度。gydF4y2Barng (0);X =兰德(n);μ=兰德(1,n);Sigma = randi([0 1],1,n);runtime(1) = timeit(@()bsxfunRemoveMeanAndScale(X, mu, sigma));runtime(2) = timeit(@()implicitExpansionRemoveMeanAndScale(X, mu, sigma));runtime(3) = timeit(@()smartRemoveMeanAndScale(X, mu, sigma));gydF4y2Ba结束gydF4y2Ba% testRemoveMeanAndScalegydF4y2Ba函数gydF4y2BaX = bsxfunRemoveMeanAndScale(X, mu, sigma)gydF4y2Ba%使用bsxfun实现gydF4y2BaX = bsxfun(@minus, X, mu);西格玛(σ= = 0)= 1;X = bsxfun(@rdivide, X, sigma);gydF4y2Ba结束gydF4y2Ba% bsxfunRemoveMeanAndScalegydF4y2Ba函数gydF4y2BaX = implicitExpansionRemoveMeanAndScale(X, mu, sigma)gydF4y2Ba使用隐式展开gydF4y2BaX = X -;西格玛(σ= = 0)= 1;X = X ./;gydF4y2Ba结束gydF4y2Ba% implicitExpansionRemoveMeanAndScalegydF4y2Ba函数gydF4y2BaX = smartRemoveMeanAndScale(X, mu, sigma)gydF4y2Ba建议隐式展开实现gydF4y2Ba西格玛(σ= = 0)= 1;X = (X -)/σ;gydF4y2Ba结束gydF4y2Ba% smartRemoveMeanAndScalegydF4y2Ba




发布与MATLAB®R2019bgydF4y2Ba

|gydF4y2Ba

评论gydF4y2Ba

要留下评论,请点击gydF4y2Ba在这里gydF4y2Ba登录到您的MathWorks帐户或创建一个新帐户。gydF4y2Ba