7

MATLAB コードをデバッグした後、可能であればアサーションをオフにして速度を少し上げたいと考えています。(アサーション内の式は非常に短くて速いですが、タイトなループ内に多くの呼び出しがあるため、合計されます。はい、プロファイリングしました。) MATLAB でグローバルに行うにはどうすればよいですか? NDEBUGC/C++ での定義、Python での最適化の有効化、または-disableassertionsJava でのフラグに似たものを探しています。での検索/置換は、私の好みassert(では醜すぎます。%assert(

4

1 に答える 1

9

これらのソリューションを投稿した後、アサーションを効果的に無効にしながら、式の実行を妨げないことがわかりました。おそらく、論理式 ( ) の短絡を利用して、 のtrue || expr評価を避けることができますexprglobal NDEBUGこれは、その代わりにを使用することで実行できますtrue。つまり、 is のときに評価されないように使用しassert(NDEBUG || expr)ます。例えば、exprNDEBUGtrue

% parentCode.m (or typed on command prompt)
global NDEBUG; NDEBUG=true;
testassertions % test script below

% testassertions.m
global NDEBUG
if isempty(NDEBUG), NDEBUG=false; end
assert(NDEBUG || fprintf('NO\n')==2) % did fprintf write 3 characters? (no, 4)
disp('Assertions are off!')

assertこのアプローチを使用するには、明らかに、このアプローチを使用するように呼び出しを変更する必要があり、上記で行ったよう(NDEBUG || expr)に、 を取り込む 2 行を追加します。これはあなたが探している「スイッチ」ではありませんが、ここでの本当の目標と思われる計算を回避します。globaltestassertions.mexpr

カスタムでオーバーライドassert.m

パスの先頭assertで独自のものでオーバーライドできます。使用するだけで機能します:assert.m varargin

function assert(varargin)
end

初めてそれを実行するかrehash、パスを実行すると、警告が表示されますが、問題ありません!

>> assert(false)
>> assert(false,'No error here',[])
>> 

エラーも警告もありません。

匿名でオーバーライドassert

assertおそらく管理が簡単なのは、変数の入力と出力のない無名関数です。

assert = @(varargin) deal;

ここではdeal、入力なしで ( nargin=0) を使用していvarargout = varargin;ます。

于 2013-10-10T23:51:30.487 に答える