You are on page 1of 12

Matrices en Visual Basic

Visual Studio 2015


Otras versiones

Para obtener la documentacin ms reciente de Visual Studio 2017 RC,


consulte Documentacin de Visual Studio 2017 RC.
Una matriz es un conjunto de valores que estn relacionados de forma lgica entre s,
como, por ejemplo, el nmero de alumnos de cada curso en una escuela primaria. Si
necesita ayuda sobre las matrices en Visual Basic para Aplicaciones (VBA), vea
la referencia del lenguaje.
Con las matrices, puede hacer hacer referencia a estos valores relacionados con el
mismo nombre y usar un nmero denominado ndice o subndice para distinguirlos. Los
valores individuales se denominan elementos de la matriz. Son contiguos desde el
ndice 0 hasta el valor de ndice ms alto.
A diferencia de una matriz, una variable que contiene un solo valor se denomina
variable escalar.
Veamos algunos ejemplos rpidos antes de la explicacin:
VB
'Declare a single-dimension array of 5 values Dim numbers(4) As Integer
Declare a single-dimension array and set array element values Dim
numbers = New Integer() {1, 2, 4, 8} Redefine the size of an existing
array retaining the current values ReDim Preserve numbers(15) Redefine
the size of an existing array, resetting the values ReDim numbers(15)
Declare a multi-dimensional array Dim matrix(5, 5) As Double Declare a
multi-dimensional array and set array element values Dim matrix = New
Integer(4, 4) {{1, 2}, {3, 4}, {5, 6}, {7, 8}} Declare a jagged array
Dim sales()() As Double = New Double(11)() {}

En este tema
Elementos de una matriz en una matriz sencilla
Creacin de una matriz
Almacenamiento de valores en una matriz
Llenado de 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 la matriz
Tipos de matriz y otros tipos

Colecciones como alternativa a las matrices

Elementos de una matriz en una matriz sencilla


En el ejemplo siguiente se declara una variable de matriz para albergar el nmero de
alumnos 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 del 0 al 6. Usar esta matriz es ms fcil que declarar siete variables.
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 la guardera).
El valor que se encuentra en el elemento representa el nmero de estudiantes
en dicho curso.

Elementos de la matriz "students"


El ejemplo siguiente 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 como un conjunto usando simplemente el nombre
variable de la matriz sin ndices.
La matriz students del ejemplo anterior usa un ndice y es unidimensional. Una matriz
que usa ms de un ndice o subndice se denomina multidimensional. Para ms
informacin, vea el resto de este tema y Dimensiones de matrices en Visual Basic.

Creacin de una matriz


El tamao de una matriz se puede definir 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 la matriz cuando
se crea, como se muestra en el ejemplo siguiente.
VB
cargoWeights = New Double(10) {}
atmospherePressures = New Short(2, 2, 4, 10) {}
inquiriesByYearMonthDay = New Byte(20)()() {}
Si tiene una matriz existente, puede volver a definir su tamao mediante la
instruccin Redim. Puede especificar que la instruccin Redim debe mantener los valores
de la matriz o puede especificar que cree una matriz vaca. El ejemplo siguiente
muestra los diferentes usos 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, consulta ReDim (Instruccin).

Almacenamiento de valores en una matriz


Puede tener acceso a cada ubicacin en una matriz mediante un ndice del tipo Integer.
Puede almacenar y recuperar los valores en una matriz haciendo referencia a cada
ubicacin de la matriz usando su ndice entre parntesis. Los ndices de matrices
multidimensionales se separan mediante comas (,). Necesita un ndice para cada
dimensin de la matriz. El ejemplo siguiente muestra algunas instrucciones que
almacenan valores en las 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 obtienen valores de las
matrices.
VB
Dim v = 2
Dim i = 1
Dim j = 1
Dim k = 1
Dim 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)

Llenado de una matriz con valores iniciales


Mediante el uso de un literal de matriz, puede crear una matriz que contiene un
conjunto inicial de valores. Un literal de matriz consta de una lista de valores separados
por comas entre llaves ({}).
Cuando se crea una matriz mediante un literal de matriz, puede proporcionar el tipo de
matriz o usar la inferencia de tipo para determinar el tipo de matriz. 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 usa la inferencia de tipos, el tipo de la matriz se determina por 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 del literal de la 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 es Object. Por ejemplo, si la
lista de valores que se proporciona al literal de matriz contiene valores de
tipo Integer, Long y Double, la matriz resultante es de tipo Double.
Tanto Integer como Long se amplan solo a Double. Por lo tanto, Double es el tipo
dominante. Para obtener ms informacin, consulta Conversiones de ampliacin y de
restriccin. Estas reglas de inferencia se aplican a tipos que se deducen para matrices
que son variables locales definidas en un miembro de clase. Aunque puede usar
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.
Puede especificar de manera explcita el tipo de los elementos de una matriz que se
crea usando 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 desde una lista de enteros.
VB
Dim values As Double() = {1, 2, 3, 4, 5, 6}

Literales de matriz anidados


Es posible crear una matriz multidimensional usando 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 usando 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 producir un error si se declarara de
manera explcita que la variable de matriz no es bidimensional.

Nota

Para evitar que se produzca un error al proporcionar literales de matriz anidados de


distintas dimensiones, incluya los literales de matriz internos entre parntesis. Los
parntesis fuerzan la evaluacin de la expresin de literal de matriz y los valores
resultantes se usan con el literal de matriz externo, tal como muestra el cdigo siguiente.
VB
Dim values = {({1, 2}), ({3, 4, 5})}
Es posible usar la inferencia de tipos al crear una matriz multidimensional con literales
de matriz anidados. Cuando se usa la inferencia de tipos, el tipo inferido es el tipo
dominante para todos los valores de todos los literales de matriz de un nivel de
anidamiento. En el ejemplo de cdigo siguiente se crea una matriz bidimensional del
tipo Double a partir de valores del tipo Integer y Double.
VB
Dim a = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}
Para obtener ejemplos adicionales, vea Cmo: Inicializar una variable de matriz en
Visual Basic.

Recorrer en iteracin una matriz


Cuando recorre en iteracin una matriz, tiene acceso a todos los elementos de la
matriz desde el ndice ms bajo hasta el ms alto.
El ejemplo siguiente recorre en iteracin una matriz unidimensional mediante el uso
de For...Next (Instruccin). El mtodo GetUpperBound devuelve el valor ms alto 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
El ejemplo siguiente recorre en iteracin una matriz multidimensional mediante el uso
de una instruccin For...Next. El mtodo GetUpperBoundtiene un parmetro que
especifica la dimensin.GetUpperBound(0) devuelve el valor de ndice ms alto de la
primera dimensin y GetUpperBound(1)devuelve el valor de ndice ms alto de 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
El ejemplo siguiente recorre en iteracin una matriz unidimensional mediante el uso
de For Each...Next (Instruccin).
VB
Dim numbers = {10, 20, 30}
For Each number In numbers
Debug.WriteLine(number)
Next
' Output:
' 10
' 20
' 30
El ejemplo siguiente recorre en iteracin una matriz multidimensional mediante el uso
de una instruccin For Each...Next. Sin embargo, tiene ms control sobre los elementos
de una matriz multidimensional si usa una instruccin ForNext anidada, como en un
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 desde un procedimiento Function, especifique el tipo de datos
de matriz y el nmero de dimensiones como tipo de valor devuelto de Function
(Instruccin). Dentro de la funcin, declare una variable de matriz local con el mismo
tipo de datos y nmero de dimensiones. En la Return (Instruccin), incluya la variable
de matriz local sin parntesis.
Para especificar una matriz como parmetro para un procedimiento Sub o Function,
defina el parmetro como una matriz con un tipo de datos especificado y el nmero de

dimensiones. En la llamada al procedimiento, enve una variable de matriz con el


mismo tipo de datos y nmero de dimensiones.
En el ejemplo siguiente, la funcin GetNumbers devuelve Integer(). Este tipo de matriz es
una matriz unidimensional de tipo Integer. 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
En el ejemplo siguiente, la funcin GetNumbersMultiDim devuelve 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 matriz de
matrices o matriz escalonada. Una matriz escalonada y cada elemento de una matriz
escalonada pueden tener una o ms dimensiones. A veces la estructura de datos de la
aplicacin es bidimensional pero no rectangular.
El ejemplo siguiente tiene una matriz de meses, siendo cada elemento una matriz de
das. Puesto que los distintos meses tienen un nmero diferente de das, los elementos
no forman una matriz bidimensional rectangular. Por lo tanto, se usa 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 que no contiene ningn elemento tambin se denomina matriz de longitud
cero. Una variable que contiene una matriz de longitud cero no tiene el valor Nothing.
Para crear una matriz que no tenga elementos, declare una de las dimensiones de la
matriz para que sea -1, tal como se muestra en el ejemplo siguiente.
VB
Dim twoDimensionalStrings(-1, 3) As String
Puede que tenga que crear una matriz de longitud cero en las circunstancias
siguientes:
Sin arriesgarse a una excepcin NullReferenceException, el cdigo debe tener
acceso a los miembros de la clase Array, como, por ejemplo, Length o Rank, o
bien deben llamar a una funcin Visual Basic como, por ejemplo, UBound.
Desea que el cdigo usado sea ms sencillo al no tener que
comprobar Nothing como caso especial.
El cdigo interacta con una interfaz de programacin de aplicaciones (API) que
requiere pasar 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 la matriz
El tamao de una matriz es el producto de las longitudes de todas sus dimensiones.
Representa el nmero total de elementos contenidos actualmente en la matriz.
En el ejemplo siguiente se declara 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.


Puede encontrar el tamao de una matriz mediante la propiedad Length. Puede
averiguar la longitud de cada dimensin de una matriz multidimensional utilizando el
mtodo GetLength.
Puede cambiar el tamao de una variable de matriz asignando un nuevo objeto de
matriz o usando la instruccin ReDim.
Hay varios aspectos que se deben tener en cuenta cuando se trabaja con el tamao de
una matriz.

Longitud de
la dimensin

El ndice de cada dimensin es de base 0, lo que significa que va desde 0


hasta su lmite mximo. Por lo tanto, la longitud de una dimensin
determinada supera en 1 el lmite mximo declarado para esa dimensin.

Lmites de
longitud

La longitud de cada dimensin de una matriz se limita al valor mximo


del tipo de datos Integer, que es (2 ^ 31) - 1. Sin embargo, el tamao total
de una matriz tambin est limitado por la memoria disponible en el
sistema. Si se intenta inicializar una matriz que supera la cantidad de
memoria RAM disponible, Common Language Runtime produce una
excepcin OutOfMemoryException.

Tamao y
tamao de
elemento

El tamao de la matriz es independiente del tipo de datos de sus


elementos. El tamao siempre representa el nmero total de elementos,
no el nmero de bytes que se usan en el almacenamiento.

Consumo de
memoria

No es seguro dar nada por supuesto en lo que respecta al modo de


almacenar una matriz 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 sistema 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 requiere 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 solo 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 la clase System.Array y puede declarar una variable del tipo Array,
pero no puede crear una matriz del tipo Array. Adems, ReDim (Instruccin) no puede
funcionar en una variable declarada de tipo Array. Por estas razones y por seguridad de
tipos, es aconsejable declarar cada matriz como un tipo especfico, como Integer en el
ejemplo anterior.
Puede averiguar el tipo de datos de una matriz o de sus elementos de varias maneras.
Puede llamar al mtodo Object.GetType en la variable para 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.
Puede pasar la variable a la funcin TypeName para recibir un String que
contiene el nombre de tipo en tiempo de ejecucin.
Puede pasar la variable a la funcin VarType para recibir un
valor VariantType valor que representa la clasificacin del 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 elementos de la matriz. El tipo de matriz es Integer(,) y los elementos
de la matriz son del tipo 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 una manera ms flexible de
trabajar con grupos de objetos. A diferencia de las matrices, el grupo de objetos con el
que trabaja puede aumentar y reducirse de manera dinmica a medida que cambian
las necesidades de la aplicacin.
Si necesita cambiar el tamao de una matriz, debe usar la ReDim (Instruccin). Al
hacerlo, Visual Basic crea una nueva matriz y libera la matriz anterior para su
eliminacin. Esto requiere tiempo de ejecucin. Por lo tanto, si el nmero de elementos
con los que trabaja cambia con frecuencia o si no puede predecir el nmero mximo de
elementos que necesita, puede obtener un mejor rendimiento si usa una coleccin.
Para algunas colecciones, puede asignar una clave a cualquier objeto que incluya en la
coleccin para, de este modo, recuperar rpidamente el objeto con la clave.
Si la coleccin contiene elementos de un solo tipo de datos, puede usar una de las
clases del espacio de nombres System.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 ms informacin sobre las colecciones de elementos, vea Colecciones.

Ejemplo
En el ejemplo siguiente se usa la clase genrica .NET
FrameworkSystem.Collections.Generic.List<T> 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 solo puede contener
elementos del 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 usa 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 llenan las matrices con valores


iniciales.

Cmo: Ordenar una matriz en


Visual Basic

Muestra cmo ordenar alfabticamente los


elementos de una matriz.

Cmo: Asignar una matriz a otra

Describe las reglas y los pasos para asignar una


matriz a otra variable de matriz.

Solucionar problemas de matrices

Describe algunos problemas comunes que surgen


al trabajar con matrices.

You might also like