Cálculo matricial

Cálculo matricial

Además del cálculo escalar, iBASIC soporta de forma nativa el cálculo matricial.

Solo lenguajes o entornos más específicos soportan esta característica, como FORTRAN o Matlab.

Con iBASIC, el uso de vectores o matrices es igual de fácil que usar números escalares.

Modo de operación

iBASIC dispone de dos modos de funcionamiento, escalar (el tradicional) y matricial.

El modo es seleccione por código, y se puede cambiar de uno a otro cuantas veces se quiera:

SET MODE SCALAR: cambiar a modo escalar

SET MODE SCALAR: cambiar a modo matricial

Por defecto, iBASIC funciona en modo escalar.

Sólo es en el modo matricial en donde se podrán realizar las operaciones sobre matriciales y usar la extensión de funciones matriciales.

La razón de disponer de estos son modos es la velocidad de ejecución del programa BASIC.

En el modo matricial, todos los números y expresiones son tratrados como matriciales, por lo que la velocidad de ejecución se ve sensiblemente mermada, entorno al 10% más despacio que en el modo escalar.

Es por ello, que se puede conmutar a modo matricial (matrix mode) cuando se requieran hacer cálculos matriciales para luego volver al escalar (scalar mode).

Definición de matrices

La definición de vectores y matriciales se hace de la forma habitual en BASIC, usando la orden DIM, y opcionalmente, con la orden OPTION BASE para definir el índice inicial:

DIM a(4) : define un vector de 5 elementos, a(0) hasta a(4)

DIM b(2,2): define una matrix 3x3, b(0,0) hasta b(2,2)

DIM c : sólo en modo matricial. Define una matriz dinámica, para ser usada para resultados de los cálculos.

Debido al funcionamiento de la orden DIM, en donde el índice comienza en cero, es aconsejable usar la orden OPTION BASE 1 para definir el índice inicial a uno:

OPTION BASE 1

DIM a(4): define un vector de 4 elementos, a(1) hasta a(4)

DIM b(2,2): matrix de 2x2, b(1,1) hasta b(2,2)

Operaciones con matrices

Se disponen de todas las operaciones y funciones matemáticas escalares pero reinterpretadas al ámbito matricial.

Se pueden hacer cosas como las siguientes:

OPTION BASE 1
SET MODE MATRIX

DIM a(4), b(2,2), c

a = 1
b = MXIDENT(2)
b(1, *) = a(2 .. 3)

c = COS(MXRND(2, 2)) * b

IF c = 0 THEN PRINT "Matriz es cero"

PRINT c(1,*):PRINT c(2, *)

Paso a paso:

OPTION BASE 1: define el índice inicial de las matrices a 1

SET MODE MATRIX: cambiar a modo matricial

DIM a(4), b(2,2), c : define un vector, una matriz y una matriz dinámica

a = 1 : todos los elementos de "a" a 1.


b = MXIDENT(2) : asignar matriz "b" una matriz identidad 2x2

b(1, *) = a(2 .. 3) : asignar los elementos "a(2)" hasta "a(3)" a la fila 1 de "b"

c = COS(MXRND(2,2)) * b : Calcula una matriz 2x2 con elementos aleatorios. Luego cálcula sus cosenos, lo multiplica, término a término, por la matriz "b" y finalmente asigna el resultado a la matriz "c".

IF c = 0 THEN PRINT "Matriz es cero" : comprueba si todos los elementos de "c" valen cero.

PRINT c(1,*):PRINT c(2, *) : imprime las dos filas de la matriz "c".

Todas las operaciones y funciones matématicas presentes en el modo escalar, en el modo matricial se pueden seguir usando pero aquí, operarán sobre cada elemento de los operandos.

MXRND es una de las funciones matriciales que se disponen. Todas ellas empiezan por MX y solo se pueden usar en modo matricial.

Compatibilidad de matrices

Cuando se hacen operaciones con matrices, iBASIC comprueba que éstas sean compatibles, esto es, que la operación se pueda realizar.

Siguiendo el ejemplo anterior, no se puede hacer la igualdad b=a porque tienen distintas dimensiones, sin embargo sí que es posible la asignación de las submatrices b(1, *) = a(2..3) ya que ambas (submatrices) tienen la misma dimension (1) y tamaño (2 elementos).

Un caso particular son las matrices que se definen como "dinámicas", como el caso de la matriz "c" del ejemplo anterior (DIM c).

Estas matrices, cuando se usan en una orden de asignación, se adaptan a las dimensiones de la matriz resultante del cálculo.

Submatrices

Como se ha visto en el ejemplo, iBASIC permite especificar submatrices, tanto a la izquierda como a la derecha de las expresiones, esto es, se pueden extraer o asignar zonas de una matriz.

La sintaxis para especificar submatrices es muy sencilla, y para explicar mejor, unos ejemplos:

DIM c(4,4) : matriz 4x4

c : acceso a toda la matriz

c(2,2) : elemento (2,2)

c(1, *) : submatriz fila 1 (todos los elementos de la fila 1)

c(*, 1) : submatriz columna 1

c(1, 2..3) : submatriz elementos 2 a 3 de la fila 1

c(2..3, 1) : submatriz elementos 2 a 3 de la columna 1

c(*, 2..3) : submatriz (4x2) con las columnas 2 a 3

c(2..3, *) : submatriz (2x4) con las filas 2 a 3

Las submatrices pueden usarse en cualquier expresión, tanto como operando y como destino de los cálculos:

c(*, 2..3) = 0 : pone a cero las columnas 2 y 3

Funciones matriciales

En el modo matricial se disponen de un conjunto de funciones para trabajar con matrices, comenzando todas ellas con el prefijo MX:

MXIDENT(orden) : crea una matriz identidad del orden indicado

MXRND(dimensiones): crea una matriz con todos los elementos aleatorios.

MXONES(dimensiones): crea una matriz con todos los elementos a 1

MXPROD(matriz, matriz) : calcula el producto vectorial de las dos matrices

MXDET(matriz) : calcula el determinante de la matriz

MXINV(matriz) : calcula la matriz inversa

MXTRANS(matriz): calcula la matriz transpuesta

MXDIM(matriz) : obtiene el número de dimensiones

MXCOF(matriz) : obtiene la matriz de cofactores

MXORDER(matriz): obtener el orden de la matriz

MXTRACE(matriz) : calcula la traza de la matriz

MXROWS(matriz) : obtener el número de filas

MXCOLUMNS(matriz) : obtener el número de columnas

MXISUM(matriz) : calcula la suma de todos los elementos de la matriz

MXIPROD(matriz) : calcula el producto de todos los elementos de la matriz