Puede simularlos, por ejemplo, con hashes, pero debe preocuparse por los ceros iniciales y muchas otras cosas. La próxima demostración funciona, pero está lejos de ser una solución óptima.
#!/bin/bash
declare -A matrix
num_rows=4
num_columns=5
for ((i=1;i<=num_rows;i++)) do
for ((j=1;j<=num_columns;j++)) do
matrix[$i,$j]=$RANDOM
done
done
f1="%$((${#num_rows}+1))s"
f2=" %9s"
printf "$f1" ''
for ((i=1;i<=num_rows;i++)) do
printf "$f2" $i
done
echo
for ((j=1;j<=num_columns;j++)) do
printf "$f1" $j
for ((i=1;i<=num_rows;i++)) do
printf "$f2" ${matrix[$i,$j]}
done
echo
done
el ejemplo anterior crea una matriz de 4x5 con números aleatorios y la imprime transpuesta, con el resultado del ejemplo
1 2 3 4
1 18006 31193 16110 23297
2 26229 19869 1140 19837
3 8192 2181 25512 2318
4 3269 25516 18701 7977
5 31775 17358 4468 30345
El principio es:Crear una matriz asociativa donde el índice es una cadena como 3,4
. Los beneficios:
- es posible usarlo para matrices de cualquier dimensión;) como:
30,40,2
para 3 dimensiones. - la sintaxis está cerca de "C" como matrices
${matrix[2,3]}
Bash no tiene una matriz multidimensional. Pero puede simular un efecto algo similar con matrices asociativas. El siguiente es un ejemplo de matriz asociativa que pretende ser utilizada como matriz multidimensional:
declare -A arr
arr[0,0]=0
arr[0,1]=1
arr[1,0]=2
arr[1,1]=3
echo "${arr[0,0]} ${arr[0,1]}" # will print 0 1
Si no declara la matriz como asociativa (con -A
), lo anterior no funcionará. Por ejemplo, si omite el declare -A arr
línea, el echo
imprimirá 2 3
en lugar de 0 1
, porque 0,0
, 1,0
y tal se tomará como expresión aritmética y se evaluará a 0
(el valor a la derecha del operador de coma).