のMatlabの各算術演算子を使用すると、その演算子を呼び出すときに呼び出されるassociated methodを持っています。例えば、*
(行列乗算)に対応する方法はmtimes
と呼ばれます。各オペレータに対して
、あなたがタイプdouble
の変数のための方法を定義することができます影組み込みメソッドとその動作を変更すること:あなたのケースでは、組み込みのメソッドを呼び出し、次にチェックし、カスタムエラーが含まれます。このアプローチの
利点は以下のとおりです。
あなたのコード内のいかなる変更は neccessaryではありません:あなたは、通常*
、*.
、+
などを使用します。それらの(エラーチェック)動作は変更されます。 (と思う)デバッグが完了したら
は、あなただけのパスからカスタムメソッドを削除する必要があります。これにより、の正常な動作が復元され、スピード違反が回避されます。後で再度デバッグする必要がある場合は、修正されたメソッドをパスに戻すだけです。私は、例として*
及びその関連mtimes
を使用し、以下において
。あなたの新しいmtimes
メソッドはMatlabのパスの適当なフォルダに置き、mtimes
よりも優先させるべきです。つまり、フォルダはMatlabのpath
にあるはずです。または、他のすべてより優先される現在のフォルダを使用することもできます。
選択したフォルダ内に@double
という名前のフォルダを作成し、mtimes.m
というファイルを作成します。これにより、*
がdouble
入力で呼び出されたときに、mtimes.m
ファイルを使用する必要があることがMatlabに伝えられます。
mtimes.m
の内容は、次の線に沿って何かすることwhould:
function C = mtimes(A,B)
if ndims(A)~=2 || ndims(B)~=2
%// number of dimensions is incorrect
error('MATLAB:mtimes_modified:ndims', ...
'One of the arrays is not a matrix: numbers of dimensions are %i and %i',...
ndims(A), ndims(B));
elseif max(size(A))>1 & max(size(B))>1 size(A,2)~=size(B,1)
%// dimensions are not appropriate for matrix multiplication,
%// or for multiplying by a matrix by a scalar
error('MATLAB:plus_modified:dimagree',...
'Sizes do not match: %i x %i and %i x %i', ...
size(A,1), size(A,2), size(B,1), size(B,2));
else
C = builtin('mtimes', A, B); %// call actual mtimes to multiply matrices
end
例の結果:実際のエラーメッセージを修正
>> rand(3,4,5)*rand(6,7)
Error using * (line 3)
One of the arrays is not a matrix: numbers of dimensions are 3 and 2
>> rand(3,4)*rand(2,5)
Error using * (line 7)
Sizes do not match: 3 x 4 and 2 x 5
>> rand(3,4)*rand(4,2)
ans =
0.3162 0.3009
1.2628 0.7552
1.2488 0.8559
は、.mファイルを見つけることによって、(と思う)が可能ですそのコード内のエラー出力を検索し、両方の行列に 'size()'を含めます。 – Adriaan
'dbstop if error'を使用すると、Matlabはエラーが発生した場所で正確に実行を停止します。変数ブラウザで可変サイズを確認し、改善されたコードを直接試すことができます。 – Daniel
ありがとう、私は 'dbstop if error'について知りませんでした。非常に便利なコマンドです! – user1111929