MATLAB Language
MATLABベストプラクティス
サーチ…
備考
このトピックでは、コミュニティが長期にわたって学習したベストプラクティスを示します。
ラインを短くする
継続文字(省略記号)を使用してください...
長い文を継続します。
例:
MyFunc( parameter1,parameter2,parameter3,parameter4, parameter5, parameter6,parameter7, parameter8, parameter9)
次のように置き換えることができます。
MyFunc( parameter1, ...
parameter2, ...
parameter3, ...
parameter4, ...
parameter5, ...
parameter6, ...
parameter7, ...
parameter8, ...
parameter9)
コードを正しくインデントする
適切なインデントは、美的外観だけでなく、コードの可読性を向上させます。
たとえば、次のコードを考えてみましょう。
%no need to understand the code, just give it a look
n = 2;
bf = false;
while n>1
for ii = 1:n
for jj = 1:n
if ii+jj>30
bf = true;
break
end
end
if bf
break
end
end
if bf
break
end
n = n + 1;
end
ご覧のとおり、どのループ文とif
文がどこで終わるif
を慎重に調べる必要があります。
スマートインデントで、あなたはこのように見えます:
n = 2;
bf = false;
while n>1
for ii = 1:n
for jj = 1:n
if ii+jj>30
bf = true;
break
end
end
if bf
break
end
end
if bf
break
end
n = n + 1;
end
これは明らかにループ/ if
文の開始と終了を示します。
あなたはスマートインデントを行うことができます:
•すべてのコードを選択する( Ctrl + A )
• Ctrl + Iを押すか、またはをクリックします。 編集バーから
アサートを使う
Matlabは非常に些細な間違いを静かに許しています。そのため、実行後のデバッグの後半でエラーが発生する可能性があります。変数について何か想定している場合は、それを検証してください。
function out1 = get_cell_value_at_index(scalar1,cell2)
assert(isscalar(scalar1),'1st input must be a scalar')
assert(iscell(cell2),'2nd input must be a cell array')
assert(numel(cell2) >= scalar1),'2nd input must have more elements than the value of the 1st input')
assert(~isempty(cell2{scalar1}),'2nd input at location is empty')
out1 = cell2{scalar1};
ループを避ける
ほとんどの場合、ループはMatlabでは計算コストがかかります。ベクトル化を使用すると、コードの処理速度が向上します。また、コードをよりモジュラにしたり、簡単に変更したり、デバッグしたりすることもよくあります。大きな欠点は、データ構造の計画に時間を掛けなければならず、寸法誤差がより簡単に来ることです。
例
書きません
for t=0:0.1:2*pi
R(end+1)=cos(t);
end
しかし
t=0:0.1:2*pi;
R=cos(t)
書きません
for i=1:n
for j=1:m
c(i,j)=a(i)+2*b(j);
end
end
しかし、
c=repmat(a.',1,m)+2*repmat(b,n,1)
詳細については、 ベクトル化を参照してください。
テンポラリファイルの一意の名前を作成する
スクリプトや関数をコーディングする際には、例えばあるデータを格納するために1つ以上の一時ファイルが必要な場合があります。
既存のファイルを上書きしたり、MATLAB関数をシャドーするのを避けるために、 tempname関数を使用して、システムの一時フォルダ内の一時ファイルの一意の名前を生成することができます。
my_temp_file=tempname
ファイル名は拡張子なしで生成されます。 tempname
によって生成された名前に目的の拡張子を連結することで追加できます
my_temp_file_with_ext=[tempname '.txt']
tempdir関数を呼び出すことで、システムの一時フォルダの場所を取得することができます。
関数/スクリプトの実行中に一時ファイルが不要になった場合は、関数deleteを使用して削除することができます
delete
は確認を求めないので、 delete
ファイルをrecycle
フォルダに移動するオプションを設定on
と便利です。
これは、次のように関数recycleを使用して行うことができます。
recycle('on')
次の例では、関数tempname
、 delete
およびrecycle
使用法を提案しています。
%
% Create some example data
%
theta=0:.1:2*pi;
x=cos(theta);
y=sin(theta);
%
% Generate the temporary filename
%
my_temp_file=[tempname '.mat'];
%
% Split the filename (path, name, extension) and display them in a message box
[tmp_file_path,tmp_file_name, tmp_file_ext]=fileparts(my_temp_file)
uiwait(msgbox(sprintf('Path= %s\nName= %s\nExt= %s', ...
tmp_file_path,tmp_file_name,tmp_file_ext),'TEMPORARY FILE'))
%
% Save the varaibles in a temporary file
%
save(my_temp_file,'x','y','theta')
%
% Load the varaibles from the temporary file
%
load(my_temp_file)
%
% Set the reclycle option on
%
recycle('on')
%
% Delete the temporary file
%
delete(my_temp_file)
警告
一時ファイル名は、 java.util.UUID.randomUUID
メソッド( randomUUID )を使用して生成されます。
MATLABがJVMなしで実行される場合、一時ファイル名は
matlab.internal.timing.timing
はCPUのカウンタと時間に基づいています。この場合、一時ファイル名は一意であるとは限りません。
validateattributesを使用する
関数validateattributesを使用すると、一連の仕様に対して配列を検証できます
したがって、関数に与えられた入力を検証するために使用することができます。
次の例では、関数test_validateattributes
に3つの入力が必要です
function test_validateattributes(input_1,input_2,input_3)
入力仕様は次のとおりです。
array_1:
- クラス:double
- サイズ:[3,2]
- values:要素はNaNでなければならない
char_array:
- クラス:char
- value:文字列は空であってはいけません
array_3
- クラス:double
- サイズ:[5 1]
- 値:要素は実数でなければならない
3つの入力を検証するには、関数validateattributes
を次の構文で呼び出すことができます。
validateattributes(A,classes,attributes,funcName,varName,argIndex)
ここで:
-
A
は暴行される配列です -
classes
:配列のtype
(例えば、single
、double
、logical
) -
attributes
:入力配列が一致しなければならないattributes
(例:[3,2], size
配列の[3,2], size
を指定するsize、配列にNaN値を持たないことを指定するnonnan
) -
funcName
:検証が行われる関数の名前です。この引数は、エラーメッセージの生成に使用されます(存在する場合) -
varName
:検証中の配列の名前です。この引数は、エラーメッセージの生成に使用されます(存在する場合) -
argIndex
:入力リスト内のインパート配列の位置です。この引数は、エラーメッセージの生成に使用されます(存在する場合)
1つまたは複数の入力が仕様と一致しない場合、エラーメッセージが生成されます。
複数の無効な入力がある場合、最初の不一致が見つかると検証が停止します。
これは、入力検証が実装されているfunction test_validateattributes
です。
関数は三つの入力を必要とするので、供給された入力の数に最初のチェックはfnctionを使用して実行される関数narginを 。
function test_validateattributes(array_1,char_array_1,array_3)
%
% Check for the number of expected input: if the number of input is less
% than the require, the function exits with an error message
%
if(nargin ~= 3)
error('Error: TEST_VALIDATEATTRIBUTES requires 3 input, found %d',nargin)
end
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Definition of the expected characteristics of the first input %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% INPUT #1 name (only used in the generation of the error message)
%
input_1_name='array_1';
%
% INPUT #1 position (only used in the generation of the error message)
%
input_1_position=1;
%
% Expected CLASS of the first input MUST BE "double"
%
input_1_class={'double'};
%
% Expected ATTRIBUTES of the first input
% SIZE: MUST BE [3,2]
%
input_1_size_attribute='size';
input_1_size=[3,2];
%
% VALUE CHECK: the element MUST BE NOT NaN
%
input_1_value_type='nonnan';
%
% Build the INPUT 1 attributes
%
input_1_attributes={input_1_size_attribute,input_1_size, ...
input_1_value_type};
%
% CHECK THE VALIDITY OF THE FIRST INPUT
%
validateattributes(array_1, ...
input_1_class,input_1_attributes,'', ...
input_1_name,input_1_position);
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Definition of the expected characteristics of the second input %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% INPUT #1 name (only used in the generation of the error message)
%
input_2_name='char_array_1';
%
% INPUT #2 position (only used in the generation of the error message)
%
input_2_position=2;
%
% Expected CLASS of the first input MUST BE "string"
%
input_2_class={'char'};
%
% VALUE CHECK: the element must be not NaN
%
input_2_size_attribute='nonempty';
%
% Build the INPUT 2 attributes
%
input_2_attributes={input_2_size_attribute};
%
% CHECK THE VALIDITY OF THE SECOND INPUT
%
validateattributes(char_array_1, ...
input_2_class,input_2_attributes,'', ...
input_2_name,input_2_position);
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Definition of the expected characteristics of the third input %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% INPUT #3 name (only used in the generation of the error message)
%
input_3_name='array_3';
%
% INPUT #3 position (only used in the generation of the error message)
%
input_3_position=3;
%
% Expected CLASS of the first input MUST BE "double"
%
input_3_class={'double'};
%
% Expected ATTRIBUTES of the first input
% SIZE: must be [5]
input_3_size_attribute='size';
input_3_size=[5 1];
% VALUE CHECK: the elements must be real
input_3_value_type='real';
%
% Build the INPUT 3 attributes
%
input_3_attributes={input_3_size_attribute,input_3_size, ...
input_3_value_type};
%
% CHECK THE VALIDITY OF THE FIRST INPUT
%
validateattributes(array_3, ...
input_3_class,input_3_attributes,'', ...
input_3_name,input_3_position);
disp('All the three input are OK')
次のスクリプトを使用して、検証手順の実装をテストできます。
それは3つの入力を生成し、無作為に、それらを無効にします。
%
% Generate the first input
%
n_rows=randi([2 3],1);
n_cols=2;
input_1=randi([20 30],n_rows,n_cols);
%
% Generate the second input
%
if(rand > 0.5)
input_2='This is a string';
else
input_2='';
end
%
% Generate the third input
%
input_3=acos(rand(5,1)*1.2);
%
% Call the test_validateattributes function with the above generated input
%
input_1
input_2
input_3
%
test_validateattributes(input_1,input_2,input_3)
これらは、 validateattributes
関数で検出された誤った入力の例です。
間違った入力
input_1 =
23 22
26 28
input_2 =
''
input_3 =
0.0000 + 0.4455i
1.2420 + 0.0000i
0.4063 + 0.0000i
1.3424 + 0.0000i
1.2186 + 0.0000i
Error using test_validateattributes (line 44)
Expected input number 1, array_1, to be of size 3x2 when it is actually
size 2x2.
間違った入力
input_1 =
22 24
21 25
26 27
input_2 =
This is a string
input_3 =
1.1371 + 0.0000i
0.6528 + 0.0000i
1.0479 + 0.0000i
0.0000 + 0.1435i
0.0316 + 0.0000i
Error using test_validateattributes (line 109)
Expected input number 3, array_3, to be real.
有効な入力
input_1 =
20 25
25 28
24 23
input_2 =
This is a string
input_3 =
0.9696
1.5279
1.3581
0.5234
0.9665
All the three input are OK
ブロックコメントオペレータ
コードを記述するコメントを追加することをお勧めします。後で返されると、他人やコーダーにとっても役立ちます。単一の行には、 %
記号を使用するかショートキーCtrl+R
を使用してコメントを付けることができます。以前コメントされた行のコメントを解除するには、 %
記号を削除するか、ショートキーCrtl Crtl+T
使用します。
各行の先頭に%
記号を追加することでコードブロックにコメントを付けることができますが、新しいバージョンのMATLAB(2015a以降)ではブロックコメント演算子 %{ code %}
を使用できます。この演算子は、コードの読みやすさを向上させます。これは、コードのコメントと関数のヘルプドキュメントの両方に使用できます。ブロックを折り畳んで展開して、コードの可読性を高めることができます。
見て分かるように、 %{
と%}
演算子は単独で行に現れなければなりません。これらの行には他のテキストを含めないでください。
function y = myFunction(x)
%{
myFunction Binary Singleton Expansion Function
y = myFunction(x) applies the element-by-element binary operation
specified by the function handle FUNC to arrays A and B, with implicit
expansion enabled.
%}
%% Compute z(x, y) = x.*sin(y) on a grid:
% x = 1:10;
y = x.';
%{
z = zeros(numel(x),numel(y));
for ii=1:numel(x)
for jj=1:numel(y)
z(ii,jj) = x(ii)*sin(y(jj));
end
end
%}
z = bsxfun(@(x, y) x.*sin(y), x, y);
y = y + z;
end