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å SmartIndentIcon från redigeringsfältet. Redaktör

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 : är type 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.

ange bildbeskrivning här

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow