MATLAB Language
MATLAB bästa praxis
Sök…
Anmärkningar
Det här ämnet visar bästa praxis som samhället har lärt sig över tid.
Håll raderna korta
Använd fortsättningstecken (ellipsis) ...
att fortsätta ett långt uttalande.
Exempel:
MyFunc( parameter1,parameter2,parameter3,parameter4, parameter5, parameter6,parameter7, parameter8, parameter9)
kan ersättas av:
MyFunc( parameter1, ...
parameter2, ...
parameter3, ...
parameter4, ...
parameter5, ...
parameter6, ...
parameter7, ...
parameter8, ...
parameter9)
Insprutningskoden ordentligt
Korrekt intryck ger inte bara det estetiska utseendet utan ökar också kodens läsbarhet.
Tänk till exempel på följande kod:
%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
Som ni ser måste du titta noga för att se vilken slinga och if
uttalanden slutar var.
Med smart intryck får du denna 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
Detta indikerar tydligt starten och slutet på slingor / if
uttalande.
Du kan göra smart intryck genom att:
• välja all din kod ( Ctrl + A )
• och tryck sedan på Ctrl + I eller klicka på från redigeringsfältet.
Använd påstå
Matlab tillåter några mycket triviala misstag att gå tyst, vilket kan leda till att ett fel tas upp mycket senare i loppet - vilket gör felsökning svår. Om du antar något om dina variabler, bekräfta det.
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};
Undvik slingor
Merparten av tiden är loopar beräkningsmässigt dyra med Matlab. Din kod kommer att vara ordningsföljd snabbare om du använder vektorisering. Det gör också ofta din kod mer modulär, lätt modifierbar och lättare att felsöka. Den största nackdelen är att du måste ta dig tid att planera datastrukturerna, och det är lättare att komma till dimensionfel.
exempel
Skriv inte
for t=0:0.1:2*pi
R(end+1)=cos(t);
end
men
t=0:0.1:2*pi;
R=cos(t)
Skriv inte
for i=1:n
for j=1:m
c(i,j)=a(i)+2*b(j);
end
end
Men något liknande
c=repmat(a.',1,m)+2*repmat(b,n,1)
För mer information, se vektorisering
Skapa unikt namn för tillfällig fil
När du kodar ett skript eller en funktion kan det vara så att en eller flera tillfälliga filer behövs för att till exempel lagra en del data.
För att undvika att skriva över en befintlig fil eller skugga en MATLAB-funktion kan tempnamnfunktionen användas för att generera ett unikt namn för en tillfällig fil i systemets temporära mapp.
my_temp_file=tempname
Filnamnet genereras utan förlängningen; det kan läggas till genom att sammanfoga den önskade anknytningen till namnet som genereras av tempname
my_temp_file_with_ext=[tempname '.txt']
Lokaliseringen av systemets temporära mapp kan hämtas genom att kaldera tempdir- funktionen.
Om den temporära filen inte längre behövs under utförandet av funktionen / skriptet kan den raderas med funktionen radera
Eftersom delete
inte be om bekräftelse, kan det vara bra att sätta on
möjligheten att flytta filen som ska tas bort i recycle
Detta kan göras genom att använda funktionen återvinna på detta sätt:
recycle('on')
I följande exempel tempname
en möjlig användning av funktionerna tempname
, delete
och 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)
Varning
Den temporära filnamnet genereras med hjälp av java.util.UUID.randomUUID
metoden ( randomUUID ).
Om MATLAB körs utan JVM, genereras det tillfälliga filnamnet med
matlab.internal.timing.timing
baserat på CPU-räknaren och tiden. I det här fallet garanteras inte det tillfälliga filnamnet vara unikt.
Använd giltiga attribut
Funktionen validateattribut kan användas för att validera en matris mot en uppsättning specifikationer
Det kan därför användas för att validera ingången som tillhandahålls till en funktion.
I följande exempel kräver funktionen test_validateattributes
tre inmatningar
function test_validateattributes(input_1,input_2,input_3)
Ingångsspecifikationen är:
array_1:
- klass: dubbel
- storlek: [3,2]
- värden: element måste inte vara NaN
char_array:
- klass: char
- värde: strängen får inte vara tom
array_3
- klass: dubbel
- storlek: [5 1]
- värden: element måste vara verkliga
För att validera de tre ingångarna kan funktionen validateattributes
anropas med följande syntax:
validateattributes(A,classes,attributes,funcName,varName,argIndex)
var:
-
A
är matrisen som ska betalas -
classes
: ärtype
av matrisen (t.ex.single
,double
,logical
) -
attributes
: är de attribut som den inmatade matrisen måste matcha (t.ex.[3,2], size
att ange storleken på matrisen,nonnan
att ange att matrisen inte ska ha NaN-värden) -
funcName
: är namnet på den funktion där valideringen sker. Detta argument används för att generera felmeddelandet (om något) -
varName
: är namnet på matrisen under validering. Detta argument används för att generera felmeddelandet (om något) -
argIndex
: är placeringen för inpurt-matrisen i listan över inmatningar. Detta argument används för att generera felmeddelandet (om något)
Om en eller flera ingångar inte stämmer med specifikationen genereras ett felmeddelande.
Vid mer än en ogiltig ingång stoppar valideringen när den första missanpassningen hittas.
Detta är function test_validateattributes
där ingångsvalideringen har implementerats.
Eftersom funktionen kräver tre ingångar, utförs en första kontroll av antalet ingivna ingångar med hjälp av 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')
Följande skript kan användas för att testa implementeringen av valideringsförfarandet.
Det genererar de tre ingångar som krävs och slumpmässigt gör det att de inte är giltiga.
%
% 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)
Detta är ett par exempel på felinmatning som upptäcks av validateattributes
:
Fel inmatning
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.
Fel inmatning
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.
Giltig inmatning
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
Blockera kommentaroperatör
Det är bra att lägga till kommentarer som beskriver koden. Det är bra för andra och även för kodaren när den returneras senare. En enda rad kan kommenteras med hjälp av %
-symbolen eller med snabbtangenten Ctrl+R
För att avmarkera en tidigare kommenterad rad tar du bort %
-symbolen eller använder snabbtangenten Crtl+T
Medan du kan kommentera ett kodblock kan du göra genom att lägga till en %
-symbol i början av varje rad, med nyare versioner av MATLAB (efter 2015a) kan du använda Block Comment Operator %{ code %}
. Denna operatör ökar kodens läsbarhet. Det kan användas för både kodkommentering och dokumentation för funktionshjälp. Blocket kan vikas och veckas ut för att öka koden läsbarhet.
Som det kan ses måste operatörerna %{
och %}
visas ensamma på linjerna. Ta inte med någon annan text på dessa rader.
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