You are on page 1of 14

Matrices en Visual Basic

Visual Studio 2013

Otras versiones
Personas que lo han encontrado til: 4 de 6 - Valorar este tema
Una matriz es un conjunto de valores relacionados lgicamente entre
s, como el nmero de estudiantes de cada curso en una escuela
primaria.
Usando una matriz, puede hacer referencia a estos valores
relacionados mediante un mismo nombre y utilizar un nmero,
denominado ndice o subndice, para distinguirlos. Los valores
individuales se llaman elementos de la matriz. Son contiguos desde el
ndice 0 hasta el valor del ndice superior.
A diferencia de una matriz, una variable que contiene un nico valor
se llama variable escalar.
En este tema
Elementos matriciales en una
simple matriz
Crear una matriz
Declarar una matriz
Almacenar valores en una
matriz
Rellenar una matriz con
valores iniciales
o Literales de matriz
anidados
Recorrer en iteracin una
matriz
Matrices como valores
devueltos y parmetros
Matrices escalonadas
Matrices de longitud cero
Tamao de una matriz
Tipos de matriz y otros tipos
Colecciones como alternativa
a las matrices

Elementos matriciales en una simple matriz


En el ejemplo siguiente se declara una variable de matriz para que
contenga el nmero de estudiantes de cada curso en una escuela
primaria.
VB
Dim students(6) As Integer

La matriz students del ejemplo anterior contiene siete elementos. Los


ndices de los elementos van de 0 a 6. Tener esta matriz es ms fcil
que declarar siete variables diferentes.
En la siguiente ilustracin se muestra la matriz students. Para cada
elemento de la matriz:
El ndice del elemento
representa el curso (el ndice
0 representa el jardn de
infancia).
El valor contenido en el
elemento representa el
nmero de estudiantes en
ese curso.
Elementos de la matriz "students"

En el ejemplo siguiente se muestra cmo hacer referencia al primer,


segundo y ltimo elemento de la matriz students.
VB
Dim kindergarten As Integer = students(0)
Dim firstGrade As Integer = students(1)
Dim sixthGrade As Integer = students(6)
MsgBox("Students in kindergarten = " & CStr(kindergarten))
MsgBox("Students in first grade = " & CStr(firstGrade))
MsgBox("Students in sixth grade = " & CStr(sixthGrade))

Puede hacer referencia a la matriz en conjunto utilizando


simplemente el nombre de la variable de la matriz sin ndices.
La matriz students del ejemplo anterior utiliza un ndice y se dice que
es unidimensional. Una matriz que utiliza ms de un ndice o
subndice se denomina multidimensional. Para obtener ms
informacin, vea el resto de este tema y Dimensiones de matrices en
Visual Basic.

Crear una matriz


Se puede definir el tamao de una matriz de varias maneras. Puede
proporcionar el tamao cuando se declara la matriz, como se muestra
en el ejemplo siguiente.
VB
Dim cargoWeights(10) As Double
Dim atmospherePressures(2, 2, 4, 10) As Short
Dim inquiriesByYearMonthDay(20)()() As Byte

Tambin puede usar una clusula New para proporcionar el tamao


de una matriz al crearla, como muestra el ejemplo siguiente.
VB
cargoWeights = New Double(10) {}
atmospherePressures = New Short(2, 2, 4, 10) {}
inquiriesByYearMonthDay = New Byte(20)()() {}

Si se tiene una matriz existente, se puede volver a definir su tamao


utilizando la instruccin Redim. Puede especificar que la
instruccin Redim deba mantener los valores que se encuentren en
la matriz o que cree una nueva matriz vaca. En el ejemplo siguiente
se muestran usos diferentes de la instruccin Redim para modificar
el tamao de una matriz existente.
VB
' Assign a new array size and retain the current element values.
ReDim Preserve cargoWeights(20)
' Assign a new array size and retain only the first five element
values.
ReDim Preserve cargoWeights(4)
' Assign a new array size and discard all current element values.
ReDim cargoWeights(15)

Para obtener ms informacin, vea Instruccin ReDim (Visual Basic).

Declarar una matriz


Una variable de matriz se declara de la misma manera que cualquier
otra variable mediante la instruccin Dim. Agregue uno o ms pares
de parntesis al nombre de tipo o de variable para indicar que
contendr una matriz en lugar de una variable escalar, que es una
variable que contiene un valor nico.
Despus de declarar la matriz, puede definir su tamao
utilizando Instruccin ReDim (Visual Basic).
El ejemplo siguiente declara una variable de matriz unidimensional
agregando un par de parntesis despus del tipo. El ejemplo tambin
especifica las dimensiones de la matriz mediante la Instruccin ReDim
(Visual Basic).
VB
' Declare a one-dimensional array.
Dim cargoWeights As Double()
' Dimension the array.
ReDim cargoWeights(15)

El siguiente ejemplo declara una variable de matriz multidimensional


agregando un par de parntesis detrs del tipo y colocando comas
dentro de los parntesis para separar las dimensiones. El ejemplo

tambin especifica las dimensiones de la matriz mediante


la Instruccin ReDim (Visual Basic).
VB
' Declare a multidimensional array.
Dim atmospherePressures As Short(,,,)
' Dimension the array.
ReDim atmospherePressures(1, 2, 3, 4)

Para declarar una variable de matriz escalonada, agregue un par de


parntesis despus del nombre de variable para cada nivel de matriz
anidada.
VB
Dim inquiriesByYearMonthDay()()() As Byte

En los ejemplos anteriores se declaran variables de matriz pero no se


les asignan matrices. Debe crear una matriz, inicializarla y asignarla a
la variable.

Almacenar valores en una matriz


Se puede tener acceso a cada ubicacin en una matriz utilizando un
ndice de tipo Integer. Se pueden almacenar y recuperar valores en
una matriz haciendo referencia a cada ubicacin de la matriz
utilizando su ndice entre parntesis. Los ndices de matrices
multidimensionales se separan mediante comas (,). Se necesita un
ndice para cada dimensin de matriz.El ejemplo siguiente muestra
algunas instrucciones que almacenan valores en matrices.
VB
Dim i = 4
Dim j = 2
Dim numbers(10) As Integer
Dim matrix(5, 5) As Double
numbers(i + 1) = 0
matrix(3, j * 2) = j

El ejemplo siguiente muestra algunas instrucciones que reciben


valores de las matrices.
VB
Dim
Dim
Dim
Dim
Dim

v = 2
i = 1
j = 1
k = 1
wTotal As Double = 0.0

Dim sortedValues(5), rawValues(5), estimates(2, 2, 2) As Double


Dim lowestValue = sortedValues(0)
wTotal += (rawValues(v) ^ 2)
Dim firstGuess = estimates(i, j, k)

Rellenar una matriz con valores iniciales


Se puede crear una matriz que contenga un conjunto inicial de
valores utilizando un literal de matriz. Un literal de matriz est
formado por una lista de valores separados por comas que se
encierran entre llaves ({}).
Cuando se crea una matriz utilizando un literal de matriz, se puede
proporcionar el tipo de la matriz o usar la inferencia de tipos para
determinarlo. El cdigo siguiente muestra ambas opciones.
VB
Dim numbers = New Integer() {1, 2, 4, 8}
Dim doubles = {1.5, 2, 9.9, 18}

Cuando se utiliza la inferencia de tipos, el tipo de la matriz lo


determina el tipo dominante en la lista de valores que se proporciona
para el literal de matriz. El tipo dominante es un tipo nico al que
todos los dems tipos en el literal de matriz se pueden ampliar. Si no
se puede determinar este tipo nico, el tipo dominante es el tipo
nico al que todos los dems tipos de la matriz se pueden
restringir. Si no se puede determinar ninguno de estos tipos nicos, el
tipo dominante esObject. Por ejemplo, si la lista de valores
proporcionada al literal de matriz contiene valores de
tipo Integer, Long yDouble, la matriz resultante es de
tipo Double. Tanto Integer como Long se amplan solo
a Double. Por consiguiente,Double es el tipo dominante. Para
obtener ms informacin, vea Conversiones de ampliacin y de
restriccin (Visual Basic).Estas reglas de inferencia se aplican a tipos
deducidos para matrices que son variables locales definidas en un
miembro de clase. Aunque se pueden utilizar literales de matriz al
crear variables de nivel de clase, no se puede usar la inferencia de
tipos en el nivel de clase. Como resultado, los literales de matriz que
se especifican en el nivel de clase deducen los valores proporcionados
para el literal de matriz como tipo Object.
Se puede especificar explcitamente el tipo de los elementos de una
matriz que se crea utilizando un literal de matriz. En este caso, los
valores del literal de matriz se deben ampliar al tipo de los elementos
de la matriz. En el ejemplo de cdigo siguiente se crea una matriz de
tipo Double a partir de una lista de enteros.
VB
Dim values As Double() = {1, 2, 3, 4, 5, 6}

Literales de matriz anidados


Se puede crear una matriz multidimensional utilizando los literales de
matriz anidados. Los literales de matriz anidados deben tener una
dimensin y un nmero de dimensiones, o rango, que sea coherente
con la matriz resultante. En el ejemplo de cdigo siguiente se crea
una matriz bidimensional de enteros utilizando un literal de matriz.
VB
Dim grid = {{1, 2}, {3, 4}}

En el ejemplo anterior, se producira un error si el nmero de


elementos en los literales de matriz anidados no coincidiese.Tambin
se producira un error si declara explcitamente que la variable de la
matriz no es bidimensional.
Nota

Para evitar que se produzca un error al proporcionar literales de matriz anidados de dimensiones diferen
se deben encerrar entre parntesis los literales de matriz internos. Los parntesis exigen la evaluacin de
expresin literal de matriz y los valores resultantes se utilizan con el literal de matriz externo, como mue
el siguiente cdigo.
VB
Dim values = {({1, 2}), ({3, 4, 5})}

Cuando se crea una matriz multidimensional utilizando literales de


matriz anidados, se puede utilizar la inferencia de tipos.Cuando se
utiliza la inferencia de tipos, el tipo deducido es el tipo dominante
para todos los valores de todos los literales de matriz en un nivel de
anidamiento. En el ejemplo de cdigo siguiente, se crea una matriz
bidimensional de tipo Double a partir de valores que son de
tipo Integer y Double.
VB
Dim a = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}

Para obtener otros ejemplos, vea Cmo: Inicializar una variable de


matriz en Visual Basic.

Recorrer en iteracin una matriz


Cuando itera por una matriz, tiene acceso a cada elemento de la
matriz desde el ndice inferior al ndice superior.

En el ejemplo siguiente se recorre en iteracin una matriz


unidimensional usando la Instruccin For...Next (Visual Basic). El
mtodo GetUpperBound devuelve el valor mximo que puede tener el
ndice. El valor de ndice mnimo es siempre 0.
VB
Dim numbers = {10, 20, 30}
For index = 0 To numbers.GetUpperBound(0)
Debug.WriteLine(numbers(index))
Next
' Output:
' 10
' 20
' 30

En el ejemplo siguiente se recorre en iteracin una matriz


multidimensional usando una instruccin For...Next. El
mtodoGetUpperBound tiene un parmetro que especifica la
dimensin. GetUpperBound(0) devuelve el valor de ndice alto para la
primera dimensin, y GetUpperBound(1) devuelve el valor de ndice
alto para la segunda dimensin.
VB
Dim numbers = {{1, 2}, {3, 4}, {5, 6}}
For index0 = 0 To numbers.GetUpperBound(0)
For index1 = 0 To numbers.GetUpperBound(1)
Debug.Write(numbers(index0, index1).ToString & " ")
Next
Debug.WriteLine("")
Next
' Output
' 1 2
' 3 4
' 5 6

En el ejemplo siguiente se recorre en iteracin una matriz


unidimensional usando una Instruccin For Each...Next (Visual Basic).
VB
Dim numbers = {10, 20, 30}
For Each number In numbers
Debug.WriteLine(number)
Next
' Output:
' 10
' 20
' 30

En el ejemplo siguiente se recorre en iteracin una matriz


multidimensional usando una instruccin For Each...Next. Sin
embargo, tiene ms control sobre los elementos de una matriz
multidimensional si utiliza una instruccin ForNextanidada, como
en el ejemplo anterior, en lugar de una instruccin For EachNext.
VB
Dim numbers = {{1, 2}, {3, 4}, {5, 6}}
For Each number In numbers
Debug.WriteLine(number)
Next
' Output:
' 1
' 2
' 3
' 4
' 5
' 6

Matrices como valores devueltos y parmetros


Para devolver una matriz de un procedimiento Function, especifique
el tipo de datos de matriz y el nmero de dimensiones como tipo de
valor devuelto de Function (Instruccin, Visual Basic). Dentro de la
funcin, declare una variable de matriz local con el mismo tipo de
datos y nmero de dimensiones. En Return (Instruccin, Visual Basic),
incluya la variable de matriz local sin parntesis.
Para especificar una matriz como parmetro para un
procedimiento Sub o Function, defina el parmetro como matriz con
un tipo de datos y un nmero de dimensiones especificados. En la
llamada al procedimiento, enve una variable de matriz con el mismo
tipo de datos y nmero de dimensiones.
El ejemplo siguiente la funcin GetNumbers devuelve
un Integer(). Este tipo de matriz es una matriz unidimensional de
tipoInteger. El procedimiento ShowNumbers acepta un
argumento Integer().
VB
Public Sub Process()
Dim numbers As Integer() = GetNumbers()
ShowNumbers(numbers)
End Sub
Private Function GetNumbers() As Integer()
Dim numbers As Integer() = {10, 20, 30}
Return numbers
End Function
Private Sub ShowNumbers(numbers As Integer())
For index = 0 To numbers.GetUpperBound(0)
Debug.WriteLine(numbers(index) & " ")
Next

End Sub
' Output:
'
10
'
20
'
30

El ejemplo siguiente la funcin GetNumbersMultiDim devuelve


un Integer(,). Este tipo de matriz es una matriz bidimensional de
tipo Integer. El procedimiento ShowNumbersMultiDim acepta un
argumento Integer(,) .
VB
Public Sub ProcessMultidim()
Dim numbers As Integer(,) = GetNumbersMultidim()
ShowNumbersMultidim(numbers)
End Sub
Private Function GetNumbersMultidim() As Integer(,)
Dim numbers As Integer(,) = {{1, 2}, {3, 4}, {5, 6}}
Return numbers
End Function
Private Sub ShowNumbersMultidim(numbers As Integer(,))
For index0 = 0 To numbers.GetUpperBound(0)
For index1 = 0 To numbers.GetUpperBound(1)
Debug.Write(numbers(index0, index1).ToString & " ")
Next
Debug.WriteLine("")
Next
End Sub
' Output
' 1 2
' 3 4
' 5 6

Matrices escalonadas
Una matriz que contiene otras matrices como elementos se conoce
como una matriz de matrices o una matriz escalonada.Una matriz
escalonada y cada elemento de una matriz escalonada pueden tener
una o varias dimensiones. En algunas ocasiones, la estructura de
datos de la aplicacin es bidimensional pero no rectangular.
El ejemplo siguiente tiene una matriz de meses, siendo cada
elemento a su vez una matriz de das. Puesto que los distintos meses
tienen un nmero distinto de das, los elementos no forman una
matriz bidimensional rectangular. Por consiguiente, se utiliza una
matriz escalonada en lugar de una matriz multidimensional.
VB
' Declare the jagged array.

' The New clause sets the array variable to a 12-element


' array. Each element is an array of Double elements.
Dim sales()() As Double = New Double(11)() {}
' Set each element of the sales array to a Double
' array of the appropriate size.
For month As Integer = 0 To 11
Dim days As Integer =
DateTime.DaysInMonth(Year(Now), month + 1)
sales(month) = New Double(days - 1) {}
Next month
' Store values in each element.
For month As Integer = 0 To 11
Dim upper = sales(month).GetUpperBound(0)
For day = 0 To upper
sales(month)(day) = (month * 100) + day
Next
Next

Matrices de longitud cero


Una matriz sin elementos se llama tambin una matriz de longitud
cero. Un variable que contiene una matriz de longitud cero no tiene el
valor Nothing. Para crear una matriz que no tenga elementos,
declare que una de las dimensiones de la matriz sea -1, como se
muestra en el ejemplo siguiente.
VB
Dim twoDimensionalStrings(-1, 3) As String

Podra necesitar crear una matriz de longitud cero en las


circunstancias siguientes:
Sin arriesgarse a una
excepcin NullReferenceExce
ption, el cdigo debe tener
acceso a miembros de la
clase Array, tales
como Length o Rank o llamar
a una funcin Visual Basic tal
como UBound.
Desea que el cdigo utilizado
sea ms sencillo sin tener
que
comprobar Nothing como
caso especial.
El cdigo interacta con una
interfaz de programacin de
aplicaciones (API) que le
exige que pase una matriz de

longitud cero a uno o ms


procedimientos o que
devuelve una matriz de
longitud cero desde uno o
ms procedimientos.

Tamao de una matriz


El tamao de una matriz es el producto de las longitudes de todas sus
dimensiones. Representa el nmero total de elementos contenido
actualmente en la matriz.
A continuacin, se muestra un ejemplo de declaracin de una matriz
tridimensional.
Dim prices(3, 4, 5) As Long

El tamao total de la matriz en la variable prices es (3 + 1) x (4 + 1) x


(5 + 1) = 120.
Se puede buscar el tamao de una matriz utilizando la
propiedad Length. Se puede encontrar la longitud de cada dimensin
de una matriz multidimensional utilizando el mtodo GetLength.
Se puede cambiar el tamao de una variable de matriz asignndole
un nuevo objeto de matriz o utilizando la instruccinReDim.
Se deben tener presentes varias cosas cuando se trata con el tamao
de una matriz.
Longitud de
la dimensin

El ndice de cada dimensin est basado en 0, lo que significa que va desde 0 hasta s
lmite superior. Por consiguiente, la longitud de una dimensin determinada supera e
al lmite superior declarado para esa dimensin.

Lmites de
longitud

La longitud de cada dimensin de una matriz est limitada al valor mximo del tipo
datos Integer que es(2 ^ 31) - 1. No obstante, la memoria disponible en el sistema
limita tambin el tamao total de una matriz.Si intenta inicializar una matriz que sup
la cantidad de memoria RAM disponible, Common Language Runtime produce una
excepcin OutOfMemoryException.

Tamao y
tamao de
elementos

El tamao de una matriz es independiente del tipo de datos de sus elementos. El tam
siempre representa el nmero total de elementos, no el nmero de bytes que utilizan
el almacenamiento.

Consumo de
memoria

No es seguro dar nada por supuesto en lo que respecta al modo de almacenar una ma
en la memoria.El almacenamiento vara en funcin de las plataformas de diferentes
anchos de datos, por lo que la misma matriz puede utilizar ms memoria en un sistem
de 64 bits que en un sistema de 32 bits. Segn la configuracin del sistema cuando
inicializa una matriz, Common Language Runtime (CLR) puede asignar el
almacenamiento para empaquetar los elementos tan juntos como sea posible o para
alinearlos todos en los lmites naturales del hardware. Asimismo, una matriz requier
una sobrecarga de almacenamiento para obtener su informacin de control y esta
sobrecarga aumenta con cada dimensin agregada.

Tipos de matriz y otros tipos


Cada matriz tiene un tipo de datos, pero difiere del tipo de datos de
sus elementos. No existe ningn tipo de datos para todas las

matrices. En su lugar, el tipo de datos de una matriz lo determina el


nmero de dimensiones, o rango, de la matriz y el tipo de datos de
los elementos de la matriz. Se considera que dos variables de matriz
son del mismo tipo de datos slo cuando tienen el mismo rango y sus
elementos tienen el mismo tipo de datos. Las longitudes de las
dimensiones de una matriz no influyen en el tipo de datos de la
matriz.
Cada matriz hereda de la clase System.Array y puede declarar una
variable que sea de tipo Array pero no puede crear una matriz de
tipo Array. Asimismo, Instruccin ReDim (Visual Basic) no puede
funcionar en una variable declarada de tipoArray. Por estas razones y
para mayor seguridad del tipo, es aconsejable declarar cada matriz
como un tipo especfico, como por ejemplo Integer en el ejemplo
anterior.
Puede averiguar el tipo de datos de una matriz o de sus elementos de
varias maneras.
Llame al
mtodo Object.GetType en la
variable a fin de recibir un
objeto Type para el tipo en
tiempo de ejecucin de la
variable. El
objeto Type contiene amplia
informacin en sus
propiedades y mtodos.
Pase la variable a la
funcin TypeName para
recibir un objeto String que
contenga el nombre del tipo
en tiempo de ejecucin.
Pase la variable a la
funcin VarType para recibir
un valor VariantType que
represente la clasificacin de
tipo de la variable.
En el ejemplo siguiente se llama a la funcin TypeName para
determinar el tipo de la matriz y el tipo de los elementos de la
matriz. El tipo de la matriz es Integer(,) y el tipo de los elementos de
la matriz es Integer.
VB
Dim thisTwoDimArray(,) As Integer = New Integer(9, 9) {}
MsgBox("Type of thisTwoDimArray is " & TypeName(thisTwoDimArray))
MsgBox("Type of thisTwoDimArray(0, 0) is " &
TypeName(thisTwoDimArray(0, 0)))

Colecciones como alternativa a las matrices

Las matrices son muy tiles para crear y trabajar con un nmero fijo
de objetos fuertemente tipados. Las colecciones proporcionan un
mtodo ms flexible para trabajar con grupos de objetos. A diferencia
de las matrices, el grupo de objetos con el que trabaja puede
aumentar y reducirse dinmicamente a medida que cambian las
necesidades de la aplicacin.
Si necesita cambiar el tamao de una matriz, debe utilizar Instruccin
ReDim (Visual Basic). Si hace esto, Visual Basic crea una nueva matriz
y libera la matriz anterior para su eliminacin. Esto requiere tiempo
de ejecucin. Por consiguiente, si el nmero de elementos con los que
trabaja cambia a menudo o no puede predecir el nmero mximo de
elementos que necesita, puede obtener un mejor rendimiento
utilizando una coleccin.
Para algunas colecciones, puede asignar una clave a cualquier objeto
que incluya en la coleccin para que pueda recuperar rpidamente el
objeto con la clave asignada.
Si su coleccin se limita a elementos de solo un tipo de datos, puede
utilizar una de las clases en el espacio de
nombresSystem.Collections.Generic. Una coleccin genrica cumple
la seguridad de tipos para que ningn otro tipo de datos se pueda
agregar a ella. Cuando recupera un elemento de una coleccin
genrica, no tiene que determinar su tipo de datos ni convertirlo.
Para obtener ms informacin sobre las colecciones, vea Colecciones
(C# y Visual Basic).

Ejemplo
En el ejemplo siguiente se utiliza la clase
genrica System.Collections.Generic.List<T> de .NET Framework para
crear una coleccin de listas de objetos Customer.
VB
' Define the class for a customer.
Public Class Customer
Public Property Name As String
' Insert code for other members of customer structure.
End Class
' Create a module-level collection that can hold 200 elements.
Public CustomerList As New List(Of Customer)(200)
' Add a specified customer to the collection.
Private Sub AddNewCustomer(ByVal newCust As Customer)
' Insert code to perform validity check on newCust.
CustomerList.Add(newCust)
End Sub
' Display the list of customers in the Debug window.
Private Sub PrintCustomers()
For Each cust As Customer In CustomerList
Debug.WriteLine(cust)
Next cust
End Sub

La declaracin de la coleccin CustomerFile especifica que slo puede


contener elementos de tipo Customer. Tambin proporciona una
capacidad inicial de 200 elementos. El
procedimiento AddNewCustomer comprueba la validez del nuevo
elemento y, a continuacin, lo agrega a la coleccin. El
procedimiento PrintCustomers utiliza un bucle For Each para recorrer
la coleccin y mostrar sus elementos.

Temas relacionados
Trmino

Definicin

Dimensiones de matrices en Visual Basic

Explica el rango y las dimensiones de las matrices.

Cmo: Inicializar una variable de matriz en


Visual Basic

Describe cmo se rellenan las matrices con valores


iniciales.

Cmo: Ordenar una matriz en Visual Basic

Muestra cmo ordenar alfabticamente los elementos


una matriz.

Cmo: Asignar una matriz a otra (Visual


Basic)

Describe las reglas y pasos para asignar una matriz a o


variable de matriz.

Solucionar problemas de matrices (Visual


Basic)

Describe algunos problemas comunes que surgen al


trabajar con matrices.

Vea tambin
Referencia
Instruccin Dim (Visual Basic)
Instruccin ReDim (Visual Basic)
Array

Adiciones de comunidad
AGREGAR