Zoeken…


Opmerkingen

Dit onderwerp bevat best practices die de community in de loop van de tijd heeft geleerd.

Houd lijnen kort

Gebruik het voortzettingsteken (ellips) ... om door te gaan met de lange verklaring.

Voorbeeld:

MyFunc( parameter1,parameter2,parameter3,parameter4, parameter5, parameter6,parameter7, parameter8, parameter9)

kan worden vervangen door:

MyFunc( parameter1, ...
        parameter2, ...
        parameter3, ...
        parameter4, ...
        parameter5, ...
        parameter6, ...
        parameter7, ...
        parameter8, ...
        parameter9)

Code correct laten inspringen

Juiste inspringing geeft niet alleen de esthetische uitstraling, maar verhoogt ook de leesbaarheid van de code.

Overweeg bijvoorbeeld de volgende code:

%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

Zoals je kunt zien, moet je goed kijken welke lus en if instructies eindigen waar.
Met slimme inspringing krijgt u deze 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

Dit geeft duidelijk het begin en einde van de loops / if aan.

Je kunt slim inspringen door:
al uw code selecteren ( Ctrl + A )
en vervolgens op Ctrl + I of klikken SmartIndentIcon van bewerkingsbalk. Editor

Gebruik assert

Matlab laat een aantal zeer triviale fouten stilletjes voorbijgaan, waardoor een fout veel later in de run kan worden opgeworpen - waardoor debuggen moeilijk wordt. Als u iets van uw variabelen veronderstelt , valideer het.

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};

Vermijd lussen

Meestal zijn lussen rekenkundig duur met Matlab. Uw code zal sneller orden van grootte zijn als u vectorisering gebruikt. Het maakt uw code ook vaak modulair, gemakkelijk aan te passen en gemakkelijker te debuggen. Het grote nadeel is dat je tijd moet nemen om de datastructuren te plannen en dimensiefouten gemakkelijker te vinden zijn.

Voorbeelden

Niet schrijven

for t=0:0.1:2*pi
    R(end+1)=cos(t);
end

maar

t=0:0.1:2*pi;
R=cos(t)

Niet schrijven

for i=1:n
    for j=1:m
        c(i,j)=a(i)+2*b(j);
    end
end

Maar zoiets als

c=repmat(a.',1,m)+2*repmat(b,n,1)

Zie vectorisatie voor meer informatie

Maak een unieke naam voor een tijdelijk bestand

Tijdens het coderen van een script of een functie kan het zijn dat een of meer dan één tijdelijk bestand nodig is om bijvoorbeeld wat gegevens op te slaan.

Om te voorkomen dat een bestaand bestand wordt overschreven of om een MATLAB-functie te overschaduwen , kan de functie tempnaam worden gebruikt om een unieke naam voor een tijdelijk bestand in de tijdelijke systeemmap te genereren.

my_temp_file=tempname

De bestandsnaam wordt gegenereerd zonder de extensie; het kan worden toegevoegd door de gewenste extensie samen te voegen met de naam die wordt gegenereerd door tempname

my_temp_file_with_ext=[tempname '.txt']

De locatie van de tijdelijke systeemmap kan worden opgehaald door de tempdir- functie uit te rekenen .

Als het tijdelijke bestand tijdens de uitvoering van de functie / het script niet langer nodig is, kan het worden verwijderd met de functie delete

Aangezien delete vraagt niet om bevestiging, kan het nuttig zijn om te stellen zijn on de optie om het bestand te worden geschrapt in het verplaatsen recycle map.

Dit kan worden gedaan door de functie recyclen op deze manier te gebruiken:

recycle('on')

In het volgende voorbeeld wordt een mogelijk gebruik van de functies tempname , delete en recycle voorgesteld.

%
% 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)

Caveat

De tijdelijke bestandsnaam wordt gegenereerd met de methode java.util.UUID.randomUUID ( randomUUID ).

Als MATLAB zonder JVM wordt uitgevoerd, wordt de tijdelijke bestandsnaam gegenereerd met behulp van
matlab.internal.timing.timing basis van de CPU-teller en tijd. In dit geval is de tijdelijke bestandsnaam niet gegarandeerd uniek.

Gebruik validateattributes

De functie validateattributes kan worden gebruikt om een array te valideren aan de hand van een set specificaties

Het kan daarom worden gebruikt om de invoer voor een functie te valideren.

In het volgende voorbeeld vereist de functie test_validateattributes drie invoer

function test_validateattributes(input_1,input_2,input_3)

De invoerspecificaties zijn:

  • array_1:

    • klasse: dubbel
    • maat: [3,2]
    • waarden: elementen mogen geen NaN zijn
  • char_array:

    • klasse: char
    • waarde: de string mag niet leeg zijn
  • array_3

    • klasse: dubbel
    • maat: [5 1]
    • waarden: elementen moeten echt zijn

Om de drie invoer te valideren, kunnen de functie validateattributes worden opgeroepen met de volgende syntaxis:

validateattributes(A,classes,attributes,funcName,varName,argIndex)

waar:

  • A is de array die moet worden gecontroleerd
  • classes : is het type van de array (bijv. single , double , logical )
  • attributes : zijn de attributen waaraan de invoerarray moet voldoen (bijv. [3,2], size om de grootte van de array te specificeren, nonnan om aan te geven dat de array geen NaN-waarden zal hebben)
  • funcName : is de naam van de functie waarin de validatie plaatsvindt. Dit argument wordt gebruikt bij het genereren van het foutbericht (indien aanwezig)
  • varName : is de naam van de array die wordt gevalideerd. Dit argument wordt gebruikt bij het genereren van het foutbericht (indien aanwezig)
  • argIndex : is de positie van de inpurt-array in de invoerlijst. Dit argument wordt gebruikt bij het genereren van het foutbericht (indien aanwezig)

In het geval dat een of meer dan één invoer niet overeenkomt met de specificatie, wordt een foutmelding gegenereerd.

In geval van meer dan één ongeldige invoer stopt de validatie wanneer de eerste mismatch wordt gevonden.

Dit zijn function test_validateattributes waarin de invoervalidatie is geïmplementeerd.

Omdat de functie drie invoer vereist, wordt een eerste controle op het aantal gegeven invoer uitgevoerd met behulp van de 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')

Het volgende script kan worden gebruikt om de implementatie van de validatieprocedure te testen.

Het genereert de drie vereiste invoer en maakt deze willekeurig ongeldig.

%
% 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)

Dit zijn een paar voorbeelden van verkeerde invoer gedetecteerd door de functie validateattributes :

Verkeerde invoer

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.

Verkeerde invoer

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.

Geldige invoer

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

Block Comment Operator

Het is een goede gewoonte om opmerkingen toe te voegen die de code beschrijven. Het is nuttig voor anderen en zelfs voor de codeur wanneer deze later wordt teruggestuurd. Een enkele regel kan worden becommentarieerd met behulp van het % -symbool of met de sneltoets Ctrl+R Verwijder het % -symbool of gebruik de sneltoets Crtl Crtl+T om een eerder gemaakte opmerking te verwijderen.

Terwijl het becommentariëren van een codeblok kan worden gedaan door een % -symbool aan het begin van elke regel toe te voegen, laten nieuwere versies van MATLAB (na 2015a) u de Block Comment Operator %{ code %} . Deze operator verhoogt de leesbaarheid van de code. Het kan worden gebruikt voor zowel code-commentaar als functiehulpdocumentatie. Het blok kan worden in- en uitgeklapt om de leesbaarheid van de code te vergroten.

voer hier de afbeeldingsbeschrijving in

Zoals te zien is, moeten de operatoren %{ en %} alleen op de regels verschijnen. Neem geen andere tekst op deze regels op.

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow