Performance 在MATLAB中使用早期纾困
这本书()中有一个例子是Performance 在MATLAB中使用早期纾困,performance,matlab,Performance,Matlab,这本书()中有一个例子是采用早期纾困(@YairAltman)。为了提高速度,我们可以转换以下代码: data = []; newData = []; outerIdx = 1; while outerIdx <= 20 outerIdx = outerIdx + 1; for innerIdx = -100 : 100 if innerIdx == 0 continue % skips to next innerIdx (=1)
采用早期纾困(@YairAltman)。为了提高速度,我们可以转换以下代码:
data = [];
newData = [];
outerIdx = 1;
while outerIdx <= 20
outerIdx = outerIdx + 1;
for innerIdx = -100 : 100
if innerIdx == 0
continue % skips to next innerIdx (=1)
elseif outerIdx > 15
break % skips to next outerIdx
else
data(end+1) = outerIdx/innerIdx;
newData(end+1) = process(data);
end
end % for innerIdx
end % while outerIdx
function bailableProcessing()
for outerIdx = 1 : 5
middleIdx = 10
while middleIdx <= 20
middleIdx = middleIdx + 1;
for innerIdx = -100 : 100
data = outerIdx/innerIdx + middleIdx;
if data == SOME_VALUE
return
else
process(data);
end
end % for innerIdx
end % while middleIdx
end % for outerIdx
end % bailableProcessing()
data=[];
新数据=[];
outerIdx=1;
而外层为15
中断%跳到下一个outerIdx
其他的
数据(end+1)=外部IDX/内部IDX;
newData(end+1)=过程(data);
结束
innerIdx的结束%
outerIdx时结束%1
根据本守则:
data = [];
newData = [];
outerIdx = 1;
while outerIdx <= 20
outerIdx = outerIdx + 1;
for innerIdx = -100 : 100
if innerIdx == 0
continue % skips to next innerIdx (=1)
elseif outerIdx > 15
break % skips to next outerIdx
else
data(end+1) = outerIdx/innerIdx;
newData(end+1) = process(data);
end
end % for innerIdx
end % while outerIdx
function bailableProcessing()
for outerIdx = 1 : 5
middleIdx = 10
while middleIdx <= 20
middleIdx = middleIdx + 1;
for innerIdx = -100 : 100
data = outerIdx/innerIdx + middleIdx;
if data == SOME_VALUE
return
else
process(data);
end
end % for innerIdx
end % while middleIdx
end % for outerIdx
end % bailableProcessing()
函数bailableProcessing()
对于outerIdx=1:5
middledx=10
而middledx比你想象的要简单得多
我们是如何进行这种转换的
不合理的。这两种代码完全不同
为什么我们在新代码中有不同的MIDLEDX范围
随机性。作者的观点有所不同
在新代码中检查innerIdx和outerIdx在哪里
不需要它,因为它不打算是相同的代码
这个新数据是什么=outerIdx/innerIdx+middleIdx计算
随机计算以及数据(end+1)=outerIdx/innerIdx代码>在原始代码中
我想作者想更深刻地说明一件事:如果你将做(可能很多)循环的代码(for/whiles,dosnt-snt)封装在函数中,如果你检测到你做了,你会发出return语句,这将导致一个有效的“可保释”计算,例如,执行工作的方法返回的时间早于正常情况。这里通过检查数据==SOME_值的条件来说明这一点;你可以选择你最喜欢的救助条件:-)
此外,第一个示例中的关键字[continue
/break
]旨在说明您可以[跳过/离开]调用它们的最内部循环。原则上,您可以通过以下方式实施救助:
bailing = false;
for outer = 1:1000
for inner = 1:1000
if <somebailingcondition>
bailing = true;
break;
else
<do stuff>
end
end
if bailing
break;
end
end
bailing=false;
对于外部=1:1000
对于内部=1:1000
如果
bailing=真;
打破
其他的
结束
结束
如果保释
打破
结束
结束
但这将是非常笨拙的,因为只要你有嵌套的循环并弄乱了代码,中断的“级联”就需要足够长的时间
我希望这可以澄清您的问题。很抱歉,我没有在正文中澄清第二个代码段不是第一个代码段的直接替代。如果您重新阅读早期纾困部分(3.1.3),您可能会发现它有两个主要部分:
本节的第一部分(包括顶部代码段)说明了使用break/continue
摆脱复杂处理循环的基本机制,以节省计算不需要的值的处理时间
与此相反,本节的第二部分处理的是希望中断不是直接父循环的祖先循环的情况。我在文中提到,在这种情况下,我们可以使用三个备选方案,您提到的第二个代码段就是其中之一(其他备选方案是使用带有break/continue
的专用标志,以及使用try/catch
块)。我在本节第二部分中提供的三个代码段应该彼此等效,但它们不等效于本节顶部的代码段
也许我应该在文本中澄清这一点,或者我应该在整个过程中使用相同的示例。我会在这本书的第二版中考虑这个问题(如果它出现的话)
在本书的其他章节中,我使用了这些代码段的一个变体来说明性能加速的其他各个方面(例如,3.1.4和3.1.6)-在所有这些情况下,代码段彼此并不等价。它们仅用于说明相应的文本
我希望你总体上喜欢我的书,并认为它很有用。如果您能在Amazon()上提供积极的反馈,我将不胜感激
p、 萨姆罗伯茨正确地推测,提到我的名字将作为一个“蝙蝠信号”,吸引我的注意力:-)
它看起来确实不像是等效代码。我不会在这件事上太努力的。试着理解你强调的提示,然后继续。谢谢你的回复。新代码的窍门是什么?把你要破坏的内部部分移出,将其移动到一个函数中,并使用return
而不是break
。这本书的作者@YairAltman偶尔也会在上面活动,所以——也许提到他的名字会成为他回答问题的一个蝙蝠信号!谢谢你的回答。我在读你的书。我发现了一些代码错误,可能对第二版有所帮助。阅读结束后,我可以将它们发送到您提供的电子邮件中。谢谢,不胜感激。我还将把它们添加到书的在线勘误表中。这是一本非常大且技术性很强的书,因此文本中必然会出现一些错误/错误/打字错误…@user2991243-我现在正在编辑我的“加速Matlab性能”书的第二版。请发电子邮件给我(gmail上的altmany)你的建议修复列表。谢谢:-)