La pregunta realmente se explica por sí misma. Sé vagamente acerca de los vectores en matemáticas, pero realmente no veo el enlace a los vectores C ++.
Los vectores (Magnitute + dirección) en física son lo primero que me viene a la mente en el momento en que escucho la palabra vectores.
RBT
Respuestas:
109
La definición matemática de un vector es un miembro del conjunto Sn, que es una secuencia ordenada de valores en un conjunto específico ( S). Esto es lo que vectoralmacena un C ++ .
Los vectores generalmente solo se consideran de 2 a 3 dimensiones debido a su uso en física. Pero, en general, en matemáticas, solo significan un conjunto de números que tiene un orden (los conjuntos matemáticos no tienen orden, son como una bolsa llena de cosas). Un vector puede tener cualquier cantidad de elementos.
Joseph Garvin
8
vartec, ¿no se puede representar un vector euclidiano como un vector de coordenadas y viceversa? Son simplemente representaciones diferentes de la misma cosa (una tupla) en el espacio euclidiano frente al espacio vectorial más general.
Calvin el
66
@Joseph Garvin: los vectores ni siquiera necesitan tener componentes que sean números. Por ejemplo, ciertos conjuntos de funciones se pueden usar para formar espacios vectoriales donde los componentes son funciones.
Jason
13
Un vector es literalmente un "portador". La misma palabra se usa para (p. Ej.) Insectos que transmiten enfermedades, y proviene de la misma raíz latina que "vehículo". Entonces es algo que te lleva de un lugar a otro. Por cierto, la palabra "matriz" también es del latín, que significa "matriz".
Artelius
77
Estos no parece satisfactoria debido a que: 1. Los vectores matemáticos no cambian de dimensión, 2. vectores matemáticos tienen operaciones que std::vectorno proporcionan, 3. El argumento de que std::vectores una secuencia ordenada de valores podría aplicarse a std::list, std::deque, std::basic_string, etc.
jamesdlin
190
Se llama vector porque Alex Stepanov, el diseñador de la Biblioteca de plantillas estándar, estaba buscando un nombre para distinguirlo de las matrices integradas. Ahora admite que cometió un error, porque las matemáticas ya usan el término 'vector' para una secuencia de números de longitud fija. C ++ 11 agrava este error al introducir una clase 'matriz' que se comporta de manera similar a un vector matemático.
Lección de Alex: ten mucho cuidado cada vez que nombres algo.
Pero la matriz tampoco utilizará la asignación de montón, lo que hace que moverla sea menos eficiente. También tenemos std :: valarray, por cierto.
sellibitze
1
Puede asignarlo en el montón si se desea un movimiento barato.
2
Es bueno saber que aprendieron esa lección a pesar de que es demasiado tarde. Aunque ... typedef o #define también pueden arreglarlo.
LearnCocos2D
44
Solo hay dos cosas difíciles en informática: invalidación de caché y nombrar cosas - Phil Karlton
RBT
8
si va a reclamar "[Alex Stepanov] admite ahora que cometió un error" en su respuesta, ¿podría proporcionar una cita?
Trevor Boyd Smith
56
Un extracto del lenguaje de programación C ++ de Bjarne Stroustrup:
"Se podría argumentar que valarray
debería haberse llamado vector
porque es un vector matemático tradicional y que ese vector
debería haberse llamado matriz . Sin embargo, esta no es la forma en que evolucionó la terminología".
Solo para decir por qué probablemente no se llama array: porque std::vectortiene un tamaño dinámico. Una matriz conceptualmente tiene una longitud fija. El siguiente estándar de C ++ tiene una std::arrayplantilla, que tiene un tamaño fijo y debe preferirse a una matriz simple:
Esto no es una gran respuesta, ya que un vector también tiene un tamaño fijo. Los vectores son valores puros, son elementos de un conjunto que junto con alguna estructura adicional forman un espacio vectorial abstracto. La noción de "cambiar el tamaño" de un vector no tiene sentido.
sara
@kai, creo que hay una confusión aquí. Sólo he abogado por eso que se no llama matriz . No he tratado de explicar por qué se llama específicamente vector . Una matriz en C ++ incluso antes de la estandarización del lenguaje siempre ha tenido un tamaño fijo, por lo que nombrar la clase redimensionable std::arrayno sería bueno.
Johannes Schaub - litb
ahora puede quejarse con razón de que esta no es una gran respuesta, sino un comentario válido. En la medida en que estoy de acuerdo con la primera media frase (hasta la coma) de su comentario. Sin embargo, ahora es demasiado tarde para mover mi respuesta a un comentario sobre la pregunta, porque estos útiles comentarios de usted y @ user12 se perderían.
Johannes Schaub - litb
Como compromiso para resolver el dilema, he hecho la wiki de la comunidad de respuestas. Esto elimina todos los puntos de voto positivo y las pérdidas de voto negativo que obtuve de mi cuenta. Si alguien todavía quiere agradecerme por mi ingenioso comentario disfrazado, puede votar este comentario representativo.
Johannes Schaub - litb
10
Para complementar la excelente respuesta de @MarkRuzon:
Alex dijo que para dar un nombre a lo que ahora se llama std :: vector, observó el nombre que Scheme y Common Lisp le habían dado a estructuras de datos similares.
Más tarde, admite que estaba equivocado porque el vector C ++ no tiene nada que ver con los vectores en matemáticas.
También dice que introdujo un error de una comunidad de 50 personas en una comunidad de 5 millones de personas, por lo que es probable que el error permanezca para siempre.
Es solo el nombre. El vector C ++ podría muy bien (o tal vez incluso más preciso) llamarse matriz dinámica o matriz redimensionable, pero este nombre simplemente se eligió . Este vector no es lo mismo que el vector de las matemáticas porque en las matemáticas los vectores son miembros de cualquier conjunto V, de modo que hay dos operaciones importantes definidas en este conjunto: + (suma de vectores) yx (multiplicación de un vector por un escalar del campo) F ) y estas operaciones satisfacen 8 axiomas :
Asociatividad de adición
u + (v + w) = (u + v) + w
La conmutatividad de la suma
u + v = v + u
Elemento de identidad de suma
Existe un elemento 0 ∈ V , llamado el vector cero , de modo que v + 0 = v para todo v ∈ V .
Elementos inversos de suma
Para cada v ∈ V, existe un elemento −v ∈ V , llamado inverso aditivo de v, de modo que v + (−v) = 0
Compatibilidad de la multiplicación escalar con la multiplicación de campo.
a (bv) = (ab) v
Elemento de identidad de multiplicación escalar.
1 v = v, donde 1 indica la identidad multiplicativa en F .
Distributividad de la multiplicación escalar con respecto a la suma de vectores
a (u + v) = au + av
Distributividad de la multiplicación escalar con respecto a la suma de campo
(a + b) v = av + bv
C ++ los std::vectoradmite a todos (no directamente, sino a través de las características de C ++), por lo que de alguna manera puede llamarse un vector, pero es solo coloquialismo y, por ejemplo Vallaray, Bjarne Stroustrup lo señaló en "Lenguaje de programación C ++" .
Ningún contenedor en C ++ tiene ese tipo de aritmética definida, por lo que no hay vectores en C ++. En particular std::vector, a no admite operaciones aritméticas y, por lo tanto, todas estas propiedades no están definidas para a std::vector. Entonces a std::vectorno califica como vector. Lo habría llamado dynamic_arrayo lo resizable_arrayque te dice qué es.
user877329
44
O simplemente "lista". Pero noooooo ... tenía que ser "vector" porque eso es lo que todos usan, ¿verdad?
LearnCocos2D
1
@ LearnCocos2D, bueno, una lista generalmente se entiende como una lista vinculada. De hecho, ya hay un contenedor llamado lista en la biblioteca estándar de C ++: es una lista doblemente vinculada.
Andrej
3
Un vector es simplemente una secuencia de valores, todos del mismo tipo. Esto está bastante en línea con el uso en matemáticas. Supongo que la idea matemática de que los vectores deberían soportar algunas operaciones comunes (como sumar y escalar por un escalar) no se transfiere, el aspecto importante es principalmente la estructura.
En el álgebra lineal, de donde proviene el "vector" en matemáticas, todo se trata de operaciones, con todos los vectores del mismo tamaño. El álgebra lineal, por lo tanto, las operaciones , es lo que hace que un grupo de números sea un vector en matemáticas.
E4z9
3
Además, si hace que almacene enteros o puntos flotantes, es un tipo excelente para almacenar N vectores dimensionales. Después de todo, un vector es una lista de números mantenidos en un orden específico.
@kai También encontrarás estos conflictos en otras áreas. Los números reales en algunos lenguajes de programación no podrán almacenarse 0.1, mientras que en matemáticas, este valor es un miembro del conjunto de números reales. En el lenguaje de programación Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) un vector es "La clase Vector implementa una matriz de objetos que puede crecer. Como una matriz, contiene componentes que se puede acceder usando un índice entero. Sin embargo, el tamaño de un Vector puede crecer o reducirse según sea necesario para acomodar la adición y eliminación de elementos después de que se haya creado el Vector ".
Johannes Schaub - litb
En cuanto a lo que un vector es , depende de cuya definición se utiliza. Como esta pregunta se hizo en stackoverflow.com , en lugar de en math.stackexchange.com , argumentaría a favor de un enfoque menos sesgado por las matemáticas aquí.
Johannes Schaub - litb
@kai Estoy bastante familiarizado con la definición de vector con respecto a los espacios vectoriales. También estoy familiarizado con las definiciones de informática, donde un vector es simplemente una lista de números adyacentes en la memoria, es decir, una matriz. Tenga en cuenta que en la página de desambiguación para el vector en wikipedia muestran que un significado es ser una matriz 1D. Este es precisamente el mismo significado que se utiliza para los procesadores de vectores, que han existido desde al menos los años 70. Por lo tanto, si bien la definición que proporcioné no es la definición matemática estricta, es una definición informática, aunque más antigua.
James Matta
3
Hace mucho tiempo, en el lenguaje B hay tipos de vectores. Entonces el lenguaje C los llamó "matrices". Luego, el C con clases y el lenguaje C ++ simplemente lo derivaron ...
Ciertamente, esta no es toda la historia. Como se mencionó anteriormente, Stepanov tomó la decisión real. Pero si todavía se usaba "vector" en C, el resultado puede parecer bastante diferente.
PD. Me pregunto por qué C cambia el nombre de "matriz". ¿Cuál fue la razón exacta?
PS2 OMI para un lenguaje como C ++, una matriz significa mejor "un tipo de elementos de retención a los que se puede acceder razonablemente a través del operador []" (es decir, no 42 [some_array_object]), por ejemplo, una instancia de std :: map como una "matriz asociativa".
pero los vectores matemáticos no son dinámicos, nunca he visto un cambio de 2D a 3D ni nada, si algo los arreglos tradicionales crean mejores vectores.
ciertos vectores matemáticos se consideran en muchas dimensiones. Si al ser dinámico quiere decir que el vector cambia su tamaño, entonces puede corresponder fácilmente a la matemática "considere este vector en la dimensión x" agregando o truncando coordenadas. Una transformación lineal simple puede mapear vectores del espacio n-dim a vectores en el espacio m-dim. Los vectores matemáticos son MUY dinámicos.
4pie0
1
No tengo idea de la verdadera razón, pero C ++ lo llama un vector en lugar de una matriz, reduce la confusión entre las estructuras C y C ++, aunque cumplen los mismos roles.
Piense en un vector C ++ como una matriz dinámica, cuyo tamaño se puede alterar insertando o eliminando elementos. No están relacionados con la definición matemática del vector.
Vectores en Matemáticas
Considere una nxmmatriz llamada A, donde ncorresponde al número de filas y mcorresponde al número de columnas. En un contexto matemático, una vez que introduce una matriz como esta, luego, no puede realizar ninguna operación fuera del Arango y tampoco puede ampliar Ael tamaño. Lo que esto significa es que no puede hacer referencia a un índice de [n + 1]y / o [m + 1].
Ahora, un vector Aderiva también estos atributos, mientras que sus dimensiones siempre serán 1xm(cualquier [i]fila seleccionada dentro A) o nx1(cualquier [j]columna seleccionada dentro A). Un vector tampoco se puede especificar como 2xn, porque una colección de vectores no se puede interpretar como un vector, mientras que un vector, que sea el [i]vector de columna Acon las dimensiones de 1xm, se puede interpretar como una matriz.
La conclusión importante es que no se pueden cambiar las dimensiones de un vector una vez que se introduce en términos matemáticos.
Vectores en C ++
En C ++, los vectores son como los vectores en matemáticas, pero a diferencia de las matemáticas, su tamaño puede modificarse . Tamaño como término se aplica aquí porque implica el recuento de elementos que contiene un vector en particular.
Usted utilizar las dimensiones plazo en términos de vectores C ++, cuando se tiene un vector de vectores: std::vector<std::vector<T>>> ragged_array. En este ejemplo, llamé a ese vector "desigual", porque demuestra cómo el tamaño de cada vector de ese vector puede alterarse independientemente. No solo viola las reglas de cómo no se pueden cambiar las dimensiones una vez que se introduce un vector particular en matemáticas, sino que también demuestra cómo no se puede usar como matriz.
Respuestas:
La definición matemática de un vector es un miembro del conjunto
S
n
, que es una secuencia ordenada de valores en un conjunto específico (S
). Esto es lo quevector
almacena un C ++ .fuente
std::vector
no proporcionan, 3. El argumento de questd::vector
es una secuencia ordenada de valores podría aplicarse astd::list
,std::deque
,std::basic_string
, etc.Se llama vector porque Alex Stepanov, el diseñador de la Biblioteca de plantillas estándar, estaba buscando un nombre para distinguirlo de las matrices integradas. Ahora admite que cometió un error, porque las matemáticas ya usan el término 'vector' para una secuencia de números de longitud fija. C ++ 11 agrava este error al introducir una clase 'matriz' que se comporta de manera similar a un vector matemático.
Lección de Alex: ten mucho cuidado cada vez que nombres algo.
fuente
Un extracto del lenguaje de programación C ++ de Bjarne Stroustrup:
fuente
El nombre proviene del álgebra lineal, donde el vector es matriz con solo una columna o solo una fila.
fuente
Solo para decir por qué probablemente no se llama
array
: porquestd::vector
tiene un tamaño dinámico. Una matriz conceptualmente tiene una longitud fija. El siguiente estándar de C ++ tiene unastd::array
plantilla, que tiene un tamaño fijo y debe preferirse a una matriz simple:fuente
std::array
no sería bueno.Para complementar la excelente respuesta de @MarkRuzon:
Alex dijo que para dar un nombre a lo que ahora se llama std :: vector, observó el nombre que Scheme y Common Lisp le habían dado a estructuras de datos similares.
Más tarde, admite que estaba equivocado porque el vector C ++ no tiene nada que ver con los vectores en matemáticas.
También dice que introdujo un error de una comunidad de 50 personas en una comunidad de 5 millones de personas, por lo que es probable que el error permanezca para siempre.
fuente
Es solo el nombre. El vector C ++ podría muy bien (o tal vez incluso más preciso) llamarse matriz dinámica o matriz redimensionable, pero este nombre simplemente se eligió . Este vector no es lo mismo que el vector de las matemáticas porque en las matemáticas los vectores son miembros de cualquier conjunto V, de modo que hay dos operaciones importantes definidas en este conjunto: + (suma de vectores) yx (multiplicación de un vector por un escalar del campo) F ) y estas operaciones satisfacen 8 axiomas :
Asociatividad de adición
u + (v + w) = (u + v) + w
La conmutatividad de la suma
u + v = v + u
Elemento de identidad de suma
Existe un elemento 0 ∈ V , llamado el vector cero , de modo que v + 0 = v para todo v ∈ V .
Elementos inversos de suma
Para cada v ∈ V, existe un elemento −v ∈ V , llamado inverso aditivo de v, de modo que v + (−v) = 0
Compatibilidad de la multiplicación escalar con la multiplicación de campo.
a (bv) = (ab) v
Elemento de identidad de multiplicación escalar.
1 v = v, donde 1 indica la identidad multiplicativa en F .
Distributividad de la multiplicación escalar con respecto a la suma de vectores
a (u + v) = au + av
Distributividad de la multiplicación escalar con respecto a la suma de campo
(a + b) v = av + bv
C ++ los
std::vector
admite a todos (no directamente, sino a través de las características de C ++), por lo que de alguna manera puede llamarse un vector, pero es solo coloquialismo y, por ejemploVallaray
, Bjarne Stroustrup lo señaló en "Lenguaje de programación C ++" .fuente
std::vector
, a no admite operaciones aritméticas y, por lo tanto, todas estas propiedades no están definidas para astd::vector
. Entonces astd::vector
no califica como vector. Lo habría llamadodynamic_array
o loresizable_array
que te dice qué es.Un vector es simplemente una secuencia de valores, todos del mismo tipo. Esto está bastante en línea con el uso en matemáticas. Supongo que la idea matemática de que los vectores deberían soportar algunas operaciones comunes (como sumar y escalar por un escalar) no se transfiere, el aspecto importante es principalmente la estructura.
fuente
Además, si hace que almacene enteros o puntos flotantes, es un tipo excelente para almacenar N vectores dimensionales. Después de todo, un vector es una lista de números mantenidos en un orden específico.
fuente
0.1
, mientras que en matemáticas, este valor es un miembro del conjunto de números reales. En el lenguaje de programación Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) un vector es "La clase Vector implementa una matriz de objetos que puede crecer. Como una matriz, contiene componentes que se puede acceder usando un índice entero. Sin embargo, el tamaño de un Vector puede crecer o reducirse según sea necesario para acomodar la adición y eliminación de elementos después de que se haya creado el Vector ".Hace mucho tiempo, en el lenguaje B hay tipos de vectores. Entonces el lenguaje C los llamó "matrices". Luego, el C con clases y el lenguaje C ++ simplemente lo derivaron ...
Ciertamente, esta no es toda la historia. Como se mencionó anteriormente, Stepanov tomó la decisión real. Pero si todavía se usaba "vector" en C, el resultado puede parecer bastante diferente.
PD. Me pregunto por qué C cambia el nombre de "matriz". ¿Cuál fue la razón exacta?
PS2 OMI para un lenguaje como C ++, una matriz significa mejor "un tipo de elementos de retención a los que se puede acceder razonablemente a través del operador []" (es decir, no 42 [some_array_object]), por ejemplo, una instancia de std :: map como una "matriz asociativa".
fuente
Supongo que proviene del término vector de fila . Además, a los científicos informáticos les encanta pensar nuevos nombres para las cosas ...
fuente
pero los vectores matemáticos no son dinámicos, nunca he visto un cambio de 2D a 3D ni nada, si algo los arreglos tradicionales crean mejores vectores.
fuente
No tengo idea de la verdadera razón, pero C ++ lo llama un vector en lugar de una matriz, reduce la confusión entre las estructuras C y C ++, aunque cumplen los mismos roles.
fuente
Piense en un vector C ++ como una matriz dinámica, cuyo tamaño se puede alterar insertando o eliminando elementos. No están relacionados con la definición matemática del vector.
Vectores en Matemáticas
Considere una
nxm
matriz llamadaA
, donden
corresponde al número de filas ym
corresponde al número de columnas. En un contexto matemático, una vez que introduce una matriz como esta, luego, no puede realizar ninguna operación fuera delA
rango y tampoco puede ampliarA
el tamaño. Lo que esto significa es que no puede hacer referencia a un índice de[n + 1]
y / o[m + 1]
.Ahora, un vector
A
deriva también estos atributos, mientras que sus dimensiones siempre serán1xm
(cualquier[i]
fila seleccionada dentroA
) onx1
(cualquier[j]
columna seleccionada dentroA
). Un vector tampoco se puede especificar como2xn
, porque una colección de vectores no se puede interpretar como un vector, mientras que un vector, que sea el[i]
vector de columnaA
con las dimensiones de1xm
, se puede interpretar como una matriz.La conclusión importante es que no se pueden cambiar las dimensiones de un vector una vez que se introduce en términos matemáticos.
Vectores en C ++
En C ++, los vectores son como los vectores en matemáticas, pero a diferencia de las matemáticas, su tamaño puede modificarse . Tamaño como término se aplica aquí porque implica el recuento de elementos que contiene un vector en particular.
Usted utilizar las dimensiones plazo en términos de vectores C ++, cuando se tiene un vector de vectores:
std::vector<std::vector<T>>> ragged_array
. En este ejemplo, llamé a ese vector "desigual", porque demuestra cómo el tamaño de cada vector de ese vector puede alterarse independientemente. No solo viola las reglas de cómo no se pueden cambiar las dimensiones una vez que se introduce un vector particular en matemáticas, sino que también demuestra cómo no se puede usar como matriz.fuente
Se pregunta que la parametrización en los tipos hace a los nombres.
aquí se arruina una columna ... (vea la fuente para algunas habilidades de codificación HTML ASP.NET del lado del servidor)
o fue una fila?
Por otra parte, pensando en el contexto de máquina de vectores MIMD o incluso SSE, el nombre todavía suena muy bien.
fuente
proviene de la estructura de matriz que se construye a partir de vectores
fuente