Buscar..


Observaciones

Este tema muestra las mejores prácticas que la comunidad ha aprendido con el tiempo.

Mantener las líneas cortas

Use el carácter de continuación (puntos suspensivos) ... para continuar con una declaración larga.

Ejemplo:

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

puede ser reemplazado por:

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

Indentar correctamente el código

La indentación adecuada proporciona no solo el aspecto estético sino que también aumenta la legibilidad del código.

Por ejemplo, considere el siguiente código:

%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

Como puede ver, debe mirar detenidamente para ver qué bucle y if declaraciones terminan donde.
Con sangría inteligente, obtendrá este 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

Esto indica claramente el inicio y el final de los bucles / if .

Puedes hacer sangría inteligente por:
seleccionando todo tu código ( Ctrl + A )
y luego presionando Ctrl + I o haciendo clic SmartIndentIcon desde la barra de edición. Editor

Usar afirmar

Matlab permite que algunos errores muy triviales pasen silenciosamente, lo que podría causar un error que se generará mucho más tarde en la ejecución, lo que dificulta la depuración. Si asumes algo sobre tus variables, valídalo .

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

Evitar bucles

La mayoría de las veces, los bucles son computacionalmente costosos con Matlab. Su código será órdenes de magnitudes más rápido si utiliza la vectorización. También a menudo hace que su código sea más modular, fácilmente modificable y más fácil de depurar. El principal inconveniente es que debe tomar tiempo para planificar las estructuras de datos, y es más fácil encontrar errores de dimensión.

Ejemplos

No escribas

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

pero

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

No escribas

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

Pero algo similar a

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

Para más detalles, ver vectorización.

Crear un nombre único para el archivo temporal

Al codificar un script o una función, puede darse el caso de que se necesite uno o más de un archivo temporal para, por ejemplo, almacenar algunos datos.

Para evitar sobrescribir un archivo existente o para sombrear una función MATLAB, la función tempname se puede usar para generar un nombre único para un archivo temporal en la carpeta temporal del sistema.

my_temp_file=tempname

El nombre del archivo se genera sin la extensión; se puede agregar concatenando la extensión deseada al nombre generado por tempname

my_temp_file_with_ext=[tempname '.txt']

La ubicación de la carpeta temporal del sistema se puede recuperar llamando a la función tempdir .

Si, durante la ejecución de la función / script, el archivo temporal ya no es necesario, se puede eliminar mediante la función eliminar

Desde delete no pide confirmación, que podría ser útil para establecer on la opción de mover el archivo que desea borrar en el recycle carpeta.

Esto se puede hacer usando la función reciclar de esta manera:

recycle('on')

En el siguiente ejemplo, se propone un posible uso de las funciones tempname , delete y 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)

Advertencia

El nombre de archivo temporal se genera utilizando el método java.util.UUID.randomUUID ( randomUUID ).

Si MATLAB se ejecuta sin JVM, el nombre de archivo temporal se genera usando
matlab.internal.timing.timing basado en el contador y el tiempo de la CPU. En este caso, no se garantiza que el nombre de archivo temporal sea único.

Use validateattributes

La función validateattributes se puede usar para validar una matriz contra un conjunto de especificaciones

Por lo tanto, se puede utilizar para validar la entrada proporcionada a una función.

En el siguiente ejemplo, la función test_validateattributes requiere tres entradas

function test_validateattributes(input_1,input_2,input_3)

Las especificaciones de entrada son:

  • array_1:

    • clase: doble
    • tamaño: [3,2]
    • Valores: los elementos no deben ser NaN.
  • char_array:

    • clase: char
    • valor: la cadena no debe estar vacía
  • array_3

    • clase: doble
    • tamaño: [5 1]
    • Valores: los elementos deben ser reales.

Para validar las tres entradas, la función validateattributes se puede llamar con la siguiente sintaxis:

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

dónde:

  • A es la matriz a ser anulada.
  • classes : es el type de la matriz (por ejemplo, single , double , logical )
  • attributes : son los atributos que la matriz de entrada debe coincidir (p [3,2], size ej., [3,2], size para especificar el tamaño de la matriz, nonnan para especificar que la matriz no tendrá valores de NaN)
  • funcName : es el nombre de la función en la que se produce la validación. Este argumento se utiliza en la generación del mensaje de error (si existe)
  • varName : es el nombre de la matriz bajo validación. Este argumento se utiliza en la generación del mensaje de error (si existe)
  • argIndex : es la posición de la matriz de entrada en la lista de entrada. Este argumento se utiliza en la generación del mensaje de error (si existe)

En caso de que una o más de una entrada no coincida con la especificación, se genera un mensaje de error.

En caso de que haya más de una entrada no válida, la validación se detiene cuando se encuentra la primera falta de coincidencia.

Esta es la function test_validateattributes en la que se ha implementado la validación de entrada.

Dado que la función requiere tres entradas, se realiza una primera comprobación del número de entradas proporcionadas utilizando el criterio de función .

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

El siguiente script se puede utilizar para probar la implementación del procedimiento de validación.

Genera las tres entradas requeridas y, al azar, las hace no válidas.

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

Estos son algunos ejemplos de entradas incorrectas detectadas por la función validateattributes :

Entrada incorrecta

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.

Entrada incorrecta

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.

Entrada valida

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

Operador de comentarios de bloque

Es una buena práctica agregar comentarios que describan el código. Es útil para otros e incluso para el codificador cuando se devuelve más tarde. Se puede comentar una sola línea usando el símbolo % o usando las Ctrl+R acceso rápido Ctrl+R Para descomentar una línea comentada previamente, elimine el símbolo % o use la tecla de Crtl+T directo Crtl+T

Mientras se puede comentar un bloque de código al agregar un símbolo % al comienzo de cada línea, las versiones más recientes de MATLAB (después de 2015a) le permiten usar el Operador de comentarios de bloque %{ code %} . Este operador aumenta la legibilidad del código. Puede usarse tanto para comentar el código como para la documentación de ayuda de la función. El bloque se puede plegar y desplegar para aumentar la legibilidad del código.

introduzca la descripción de la imagen aquí

Como se puede ver, los operadores %{ y %} deben aparecer solos en las líneas. No incluya ningún otro texto en estas líneas.

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow