2010-11-21 10 views
18

La indexación de una matriz de longitud n en C es de 0: N-1. mientras que en MATLAB es de 1: NEstá disponible la indexación basada en cero en MATLAB

Ahora estoy más cómodo con la indexación de estilo C. ¿Hay alguna forma de decirle a MATLAB, incluyendo algún comando en mis scripts de MATLAB o lo que sea, que adopte una indexación tipo C en lugar de la indexación tradicional 1: N?

+4

Como alguien que regularmente tiene que usar MATLAB para una clase, no puedo decirle cuánto deseo que esto fuera posible. Eso y ser capaz de hacer un 'var ++;' pero, por desgracia, MATLAB tiene un lugar y ese lugar no está en una seria programación no matemática. –

+1

Puede ser una tarea interesante agregar tal característica a MATLAB sin descifrar el código. – zellus

+8

@zellus - "Definir interesante". ; "Oh, Dios, oh Dios, todos vamos a morir" – Donnie

Respuesta

10

No, y creo que la diferencia radica en el hecho de que los matemáticos empiezan a contar a partir de 1. (no es que MATLAB es más adecuado para los matemáticos, por el contrario, se utiliza por ingenieros más (en comparación con Mathematica o Maple cuyo procesamiento simbólico es más poderoso))

Si desea codificar basado en cero, pero similar a MATLAB, consulte NumPy and SciPy, paquetes de Python.

También vea Why numbering should start at zero para comentarios sobre la indexación basada en cero versus uno basado en general, y MATLAB indexing issue para una discusión específica de MATLAB. Ver https://plus.google.com/115212051037621986145/posts/YTUxbXYZyfi para una discusión de esto en Python.

+0

Descripción general de la wikipedia: http://en.wikipedia.org/wiki/Comparison_of_programming_languages_(array) – zellus

+0

Estos enlaces fueron informativos. ¡Muchas gracias! – smilingbuddha

+5

Soy matemático y cuento desde 0. :(Más en serio, los matemáticos están acostumbrados a indexar el tiempo por t = 0, t = 1, ... etc. Matlab se usa mucho para el análisis numérico (ecuaciones diferenciales) y el la condición inicial siempre es 0. eg y (0) = valor inicial. – Legendre

3

En una palabra: no ...

9

Usted podría potencialmente hacer algo como esto por la sobrecarga de las funciones SUBSREF y SUBSASGN para todos los diferentes tipos de objetos (incorporado o definido por el usuario) que desea cambiar el esquema de indexación para. Un ejemplo de una forma de sobrecargar métodos para tipos incorporados se da en my answer a this question. Los inconvenientes? ...

  • Esto sería una empresa grande y traidora.
  • Rompe todas las funciones integradas que dependen de la indexación basada en una sola, lo que significa que básicamente tendría que volver a escribir la mayoría de MATLAB.
  • Cualquier código que desee utilizar from other MATLAB users, que también se basaría en la indexación basada en uno, tendría que ser reescrito.

En resumen, el cambio de la forma incorporado de tipos manejar la indexación no es ni remotamente factible. Sin embargo, hay otra opción (aunque todavía un poco peligrosa) que hace uso de subclassing in MATLAB's OOP system. Por ejemplo, usted podría hacer una nueva clase double_zb que hereda de la clase double incorporada:

classdef double_zb < double 
    methods 
     function obj = double_zb(data) 
     if nargin == 0 
      data = 0; 
     end 
     obj = [email protected](data); % initialize the base class portion 
     end 
    end 
end 

A continuación, se puede extender double_zb con implementaciones especializadas de SUBSREF y SUBSASGN que tienen índices de base cero. Sin embargo, usar objetos double_zb en lugar de objetos double de manera efectiva en su código puede requerir que implemente de nuevo todos los demás métodos para objetos double o implemente de algún modo métodos de conversión para usar objetos double_zb con métodos double. Ni siquiera estoy seguro de todos los detalles involucrados en hacer esto, pero ciertamente puedo decir que sería un dolor de cabeza colosal.

Mi último consejo ... deja de preocuparte y aprende a amar la indización basada en uno. ;)

+8

No se puede dejar de pensar en " The Sorcerer's Apprentice "por JW Goethe al leer esta publicación. – zellus

+0

En cuanto a la sobrecarga de SUBSREF y SUBSASGN como se señaló al principio, no se podía establecer una variable lógica global cada vez que se desea usar indexación basada en 0, y tener la sobrecarga SUBSREF y SUBSASGN comprueban esa variable y usan la clásica indexación basada en 1 si no está presente; ;-) –

6

En realidad, Matlab puede usar índices basados ​​en cero. Están indicados con un operador de prefijo "1+" (por desgracia bastante de baja precedencia y más oscura documentada), es decir

(1+ (0: m)) un

fuente: http://www.mathworks.com/matlabcentral/newsreader/view_thread/11510

supongo que el "1+" vino de PPL que viven en el mundo de una base: añadir uno para hacer de base uno índice.

+9

No es una indexación basada en cero. El '1 +' simplemente agrega un valor escalar de 1 a todas las entradas en el vector '(0: m)', creando un índice basado en uno '1: (m + 1)' que se usa para indexar 'a' . – gnovice

+7

Es cierto, pero es una solución trivial, aunque útil, cuando necesita que su código coincida visualmente con una fórmula basada en cero – acjay

2

Uso Matlab para matemáticas y usamos mucho "start at time = 0". Mi solución a este era escribir una función:

time(x) = x + 1 

Por ejemplo, si tengo una matriz y = [0,1,2,3,4] que representa los valores de y en el tiempo de 0,1,2 , 3,4 respectivamente. Puedo hacer esto:

y(time(0)) 

Que produce el resultado correcto de 0. Esto evita tener que modificar todas mis ecuaciones.

Cuestiones relacionadas