Math::...:Matrix(3pm)
๐ Math::GSL::Matrix โ the Perl manual page, bestie edition ๐
okay so this is the Math::GSL::Matrix page from the User Contributed Perl Documentation, and it's a LOT (we're in part 1 of 3, so hydrate ๐
). It's all about matrices. You know, the little grids of numbers that run the entire world. Let's go.
โจ NAME โจ
Math::GSL::Matrix โ mathematical functions concerning Matrices ๐งฎ
๐ธ SYNOPSIS ๐ธ
like, here's the vibe, a whole mood board in code:
use Math::GSL::Matrix qw/:all/;
my $matrix1 = Math::GSL::Matrix->new(5,5); # OO interface
my $matrix2 = $matrix1 + 4; # You can add or subtract values or matrices to OO matrices
my $matrix3 = $matrix1 - 4;
my $matrix4 = $matrix2 + $matrix1;
my $matrix5 = $matrix2 . $matrix1; # This is a scalar product, it simply multiply each element
# with the element of $matrix1 that have the same position
# See Math::GSL::BLAS if you want scalar product
my $matrix6 = $matrix2 . 8; # Multiply every elements of $matrix2 by 8
my $matrix7 = $matrix2 * $matrix1; # scalar product of two matrices
if($matrix1 == $matrix4) ...
if($matrix1 != $matrix3) ...
my $matrix8 = gsl_matrix_alloc(5,5); # standard interface
๐ฆ DESCRIPTION ๐ฆ
This module is part of the Math::GSL distribution. It defines a Perl insterface to GNU Scientific Library matrices. (yes, "insterface" โ that's what the original says, and we respect the original's spelling era ๐โจ)
There are two different (but not exclusive) ways to use this module: using the OO API, built manually over the GSL functions, or using directly the functions defined by GSL library.
Pick your fighter. Or, honestly, use both, nobody's gonna stop you.
๐ OBJECT ORIENTED API ๐
๐ผ Constructor
Math::GSL::Matrix->new()
Creates a new Matrix of the given size. iconic behaviour. no notes.
my $matrix = Math::GSL::Matrix->new(10,10);
If by any chance you already have a gsl_matrix and want to "objectify" it, you can use the following constructor:
my $m = gsl_matrix_alloc(10, 20);
# ... something
my $matrix = Math::GSL::Matrix->new($m);
โ ๏ธ careful babes:$mis NOT copied. The new object will just refer to the oldgsl_matrix. It's giving "same soul, new outfit" โ change one, you changed the other. ๐
๐ผ Getters
raw()
Gets the underlying GSL matrix object created by SWIG โ super useful for using gsl_matrix_* functions which do not have an OO counterpart. the backstage pass, basically.
my $matrix = Math::GSL::Matrix->new(3,3);
my $gsl_matrix = $matrix->raw;
my $stuff = gsl_matrix_get($gsl_matrix, 1, 2);
dim()
Returns the number of rows and columns in a matrix as an array. periodt.
my ($rows, $cols) = $matrix->dim;
Basically a shortcut to rows and cols methods.
rows()
Returns the number of rows in the matrix.
my $rows = $matrix->rows;
cols()
Returns the number of columns in the matrix.
my $cols = $matrix->cols;
as_list()
Get the contents of a Math::GSL::Matrix object as a Perl list. unpacking the whole thing, fr fr.
my $matrix = Math::GSL::Matrix->new(3,3);
...
my @matrix = $matrix->as_list;
as_vector()
Returns a 1xN or Nx1 matrix as a Math::GSL::Vector object. Dies if called on a matrix that is not a single row or column. Useful for turning the output of col() or row() into a vector, like so:
my $vector1 = $matrix->col(0)->as_vector;
my $vector2 = $matrix->row(1)->as_vector;
get_elem()
Returns an element of a matrix. single number, single moment. โจ
my $matrix = Math::GSL::Matrix->new(3,3);
...
my $middle = $matrix->get_elem(1,1);
๐ NOTE: just like any other method on this module, rows and arrays start with indice 0. Zero-indexed bestie. The first thing is the zeroth thing.
row()
Returns a row matrix of the row you enter.
my $matrix = Math::GSL::Matrix->new(3,3);
...
my $matrix_row = $matrix->row(0);
col()
Returns a col matrix of the column you enter.
my $matrix = Math::GSL::Matrix->new(3,3);
...
my $matrix_col = $matrix->col(0);
max()
Computes the maximum value of a matrix. In array context it returns the maximum value and the position of that element in the matrix. If the matrix is a vector (being it vertical or horizontal) only one coordinate is returned: the position of the element in the vector.
$max = $matrix->max();
($max, $i, $j) = $matrix->max();
min()
Computes the minimum value of a matrix. In array context it returns the minimum value and the position of that element in the matrix. If the matrix is a vector (being it vertical or horizontal) only one coordinate is returned: the position of the element in the vector.
$min = $matrix->min();
($min, $i, $j) = $matrix->min();
๐ Setters
identity()
Set a matrix to the identity matrix, i.e. one on the diagonal and zero elsewhere. it's literally the "know thyself" of matrices. ๐ช
my $I = $matrix->identity;
zero()
Set a matrix to the zero matrix. the void. the reset. the "new year new me".
$matrix->zero;
set_elem()
Sets a specific value in the matrix.
my $matrix = Math::GSL::Matrix->new(2,2);
$matrix->set_elem(0, 0, $value);
You can set multiple elements at once with chained calls:
$matrix->set_elem(0,0,1)->set_elem(1,1,1);
๐ NOTE: just like any other method on this module, rows and arrays start with indice 0. yes, again. it's important.
set_row()
Sets a the values of a row with the elements of an array.
my $matrix = Math::GSL::Matrix->new(3,3);
$matrix->set_row(0, [8, 6, 2]);
You can also set multiple rows at once with chained calls:
my $matrix = Math::GSL::Matrix->new(3,3);
$matrix->set_row(0, [8, 6, 2])
->set_row(1, [2, 4, 1]);
...
set_col()
Sets a the values of a column with the elements of an array.
my $matrix = Math::GSL::Matrix->new(3,3);
$matrix->set_col(0, [8, 6, 2]);
You can also set multiple columns at once with chained calls:
my $matrix = Math::GSL::Matrix->new(3,3);
$matrix->set_col(0, [8, 6, 2])
->set_col(1, [2, 4, 1]);
...
๐ง Utility Functions
copy()
Returns a copy of the matrix, which has the same size and values but resides at a different location in memory. a true clone, not a shared braincell situation.
my $matrix = Math::GSL::Matrix->new(5,5);
my $copy = $matrix->copy;
is_square()
Returns true if a matrix is square, i.e. it has the same number of rows as columns, false otherwise. vibe check: is it even? ๐
det()
Returns the determinant of a matrix (computed by LU decomposition) or dies if called on a non-square matrix.
my $det = $matrix->det();
write
Saves ONE matrix into a file using the GSL binary format.
$matrix->save("matrix.dat");
Note that this method always overwrite the file if it exists. In case more than one GSL object will be written to the file, please use the gsl_fopen, gsl_matrix_fwrite and gsl_fclose manually. Future versions might include helper for this task. (manifesting that helper for us ๐ฏ๏ธ)
๐ NOTE: in order to allow the read of one of these files without needing to know in advance the size of the matrix, an horizontal matrix with two elements is saved in the beginning of the file with the number of rows and columns of the saved matrix. sneaky little header. little metadata garnish. ๐
read
Loads a matrix from a GSL binary file (saved using the save method, as it stores some extra information on the file). so like, round trip. besties reuniting.
my $matrix = Math::GSL::Matrix->read("matrix.dat");
lndet()
Returns the natural log of the absolute value of the determinant of a matrix (computed by LU decomposition) or dies if called on a non-square matrix.
my $lndet = $matrix->lndet();
inverse()
Returns the inverse of a matrix or dies when called on a non-square matrix.
my $inverse = $matrix->inverse;
transpose()
Returns the transpose of a matrix or dies when called on a non-square matrix.
my $transposed = $matrix->transpose;
eigenvalues()
Computes the a matrix eigen values.
eigenpair()
(no description here, it just exists, standing there, mysterious ๐ญ)
ieach()
Applied a function to each element of a matrix.
# compute exp to each element of matrix
$matrix->ieach( sub { exp(shift) });
โผ๏ธ This method changes the original matrix. See each for a non destructive method. it's the in-place one. no take-backs.
each()
Applied a function to each element of a matrix.
# compute exp to each element of matrix
$matrix->each( sub { exp(shift) });
This method returns a new matrix. soft girl version, no damage done. ๐
vconcat ()
Concatenates vertically a new matrix with the object matrix, where the object matrix is above in the final matrix. Note that both matrices need to have the same number of columns. The method returns a new matrix.
my $final = $m1->vconcat($m2);
# $final is $m1 on top of $m2
hconcat ()
Concatenates horizontally a new matrix with the object matrix, where the object matrix is at the left in the final matrix. Note that both matrices need to have the same number of rows. The method returns a new matrix.
my $final = $m1->hconcat($m2);
# $final is $m1 at the left of $m2
random ()
Fills a matrix with random values between 0 and 1. chaos theory but make it cute. ๐ฒ
๐ GSL FUNCTION INTERFACE ๐
Here is a list of all the functions included in this module :
(โฆand bestie, that list is coming right up in part 2, don't you dare leave ๐)
gsl_matrix_alloc($i, $j)โ hands you a whole newgsl_matrixwith $i rows and $j columns, no cap โจgsl_matrix_calloc($i, $j)โ literally the same thing, $i rows and $j columns, except every element gets initialized to zero for you ๐ซงgsl_matrix_alloc_from_blockgsl_matrix_freegsl_matrix_alloc_from_matrixgsl_vector_alloc_row_from_matrixgsl_vector_alloc_col_from_matrixgsl_matrix_submatrix($m, $k1, $k2, $n1, $n2)โ returns a matrix view of the matrix$m. The upper-left element of that submatrix is the element ($k1,$k2) of the original matrix, and the submatrix has $n1 rows and $n2 columns ๐gsl_matrix_row($m , $i)โ returns a vector view of the $i-th row of the matrix$m๐ธgsl_matrix_column($m, $j)โ returns a vector view of the $j-th column of the matrix$m๐ฆgsl_matrix_diagonal($m)โ returns a vector view of the diagonal. The matrix doesn't have to be square, bestie, she's flexible ๐gsl_matrix_subdiagonal($m, $k)โ returns a vector view of the $k-th subdiagonal of the matrix$m. The diagonal of the matrix corresponds to k=0, iykyk โจgsl_matrix_superdiagonal($m, $k)โ returns a vector view of the $k-th superdiagonal of the matrix$m. And nope, the matrix doesn't have to be square here either ๐gsl_matrix_subrow($m, $i, $offset, $n)โ returns a vector view of the $i-th row of the matrix$m, but starting at $offset elements in and containing $n elements ๐gsl_matrix_subcolumn($m, $j, $offset, $n)โ returns a vector view of the $j-th column of the matrix$m, starting at $offset elements in and containing $n elements ๐gsl_matrix_view_array($base, $n1, $n2)โ this one returns a matrix view of the array reference$base. The matrix has $n1 rows and $n2 columns, and the physical number of columns in memory is also given by $n2. Mathematically the (i,j)-th element of the new matrix is given by,m'(i,j) = $base->[i*$n2 + j], where the index i runs from 0 to$n1-1and the index j runs from 0 to$n2-1. Now listen โ the new matrix is only a view of the array reference$base. When the view goes out of scope, the original array reference$basewill continue to exist, and the original memory can only be deallocated by freeing the original array. And of course, the original array should not be deallocated while the view is still in use ๐gsl_matrix_view_array_with_tda($base, $n1, $n2, $tda)โ returns a matrix view of the array reference$basewith a physical number of columns$tda, which may differ from the corresponding dimension of the matrix. The matrix has $n1 rows and $n2 columns, and the physical number of columns in memory is given by $tda. Mathematically, the (i,j)-th element of the new matrix is given by,m'(i,j) = $base->[i*$tda + j], where the index i runs from 0 to$n1-1and the index j runs from 0 to$n2-1. Same vibe as above: this is only a view of the array reference$base. When the view goes out of scope,$basewill continue to exist, the original memory can only be deallocated by freeing the original array, and you should absolutely not deallocate the original array while the view is still in use ๐gsl_matrix_view_vectorgsl_matrix_view_vector_with_tdagsl_matrix_const_submatrixgsl_matrix_get($m, $i, $j)โ returns the (i,j)-th element of the matrix$m๐gsl_matrix_set($m, $i, $j, $x)โ sets the value of the (i,j)-th element of the matrix$mto$xโ๏ธgsl_matrix_ptrgsl_matrix_const_ptrgsl_matrix_set_zero($m)โ sets all the elements of the matrix$mto zero ๐ซงgsl_matrix_set_identity($m)โ sets the elements of the matrix$mto the corresponding elements of the identity matrix ๐gsl_matrix_set_all($m, $x)โ sets all the elements of the matrix$mto the value$x๐gsl_matrix_fread($fh, $m)โ reads a file which has been written withgsl_matrix_fwritefrom the stream$fh(opened with thegsl_fopenfunction from theMath::GSLmodule) and stores the data inside the matrix$m๐gsl_matrix_fwrite($fh, $m)โ writes the elements of the matrix$min binary format to a stream$fhopened with thegsl_fopenfunction from theMath::GSLmodule โ๏ธgsl_matrix_fscanf($fh, $m)โ reads a file which has been written withgsl_matrix_fprintffrom the stream$fh(opened with thegsl_fopenfunctionfrom theMath::GSLmodule) and stores the data inside the matrix$m๐gsl_matrix_fprintf($fh, $m, $format)โ writes the elements of the matrix$min the format$format(for example"%f"is the format fordouble) to a stream$fhopened with thegsl_fopenfunction from theMath::GSLmodule ๐gsl_matrix_memcpy($dest, $src)โ copies the elements of the matrix$srcto the matrix$dest. The two matrices must have the same size, no exceptions ๐จgsl_matrix_swap($m1, $m2)โ exchanges the elements of the matrices$m1and$m2by copying. Again, both matrices must have the same size ๐gsl_matrix_swap_rows($m, $i, $j)โ exchanges the $i-th and $j-th row of the matrix$m. Returns0if the operation succeeded,1otherwise โgsl_matrix_swap_columns($m, $i, $j)โ exchanges the $i-th and $j-th column of the matrix$m. Returns0if the operation succeeded,1otherwise โgsl_matrix_swap_rowcol($m, $i, $j)โ exchanges the $i-th row and the $j-th column of the matrix$m. The matrix must be square for this one. Returns0if the operation succeeded,1otherwise โ ๏ธgsl_matrix_transpose($m)โ replaces the matrix m by its transpose, copying the elements of the matrix in-place. The matrix must be square for this operation to even be possible ๐gsl_matrix_transpose_memcpy($dest, $src)โ makes the matrix$destthe transpose of the matrix$src. This one works for all matrices, as long as the dimensions ofdestmatch the transposed dimensions ofsrc๐gsl_matrix_max($m)โ returns the maximum value in the matrix$m๐ฅgsl_matrix_min($m)โ returns the minimum value in the matrix$mโ๏ธgsl_matrix_minmax($m)โ returns two values: the first is the minimum value of the Matrix$m, and the second is the maximum of the same matrix โจgsl_matrix_max_index($m)โ returns two values: the first is the i indice of the maximum value of the matrix$m, and the second is the j indice of that same value ๐gsl_matrix_min_index($m)โ returns two values: the first is the i indice of the minimum value of the matrix$m, and the second is the j indice of that same value ๐gsl_matrix_minmax_index($m)โ returns four values: the first is the i indice of the minimum of the matrix$m, the second is the j indice of that same value, the third is the i indice of the maximum of the matrix$m, and the fourth is the j indice of that same value ๐gsl_matrix_isnull($m)โ returns1if all the elements of the matrix$mare zero,0otherwise ๐ซงgsl_matrix_ispos($m)โ returns1if all the elements of the matrix$mare strictly positive,0otherwise โgsl_matrix_isneg($m)โ returns1if all the elements of the matrix$mare strictly negative,0otherwise โgsl_matrix_isnonneg($m)โ returns1if all the elements of the matrix$mare non-negative,0otherwise ๐gsl_matrix_add($a, $b)โ adds the elements of matrix$bto the elements of matrix$aโgsl_matrix_sub($a, $b)โ subtracts the elements of matrix$bfrom the elements of matrix$aโgsl_matrix_mul_elements($a, $b)โ multiplies the elements of matrix$aby the elements of matrix$bโ๏ธgsl_matrix_div_elements($a, $b)โ divides the elements of matrix$aby the elements of matrix$bโgsl_matrix_scale($a, $x)โ multiplies the elements of matrix$aby the constant factor$x๐ธgsl_matrix_add_constant($a, $x)โ adds the constant value$xto the elements of the matrix$a๐gsl_matrix_add_diagonal($a, $x)โ adds the constant value$xto the elements of the diagonal of the matrix$a๐gsl_matrix_get_row($v, $m, $i)โ copies the elements of the $i-th row of the matrix$minto the vector$v. The length of the vector must be the same as the length of the row. Returns0if it succeeded,1otherwise โgsl_matrix_get_col($v, $m, $i)โ copies the elements of the $j-th column of the matrix$minto the vector$v. The length of the vector must be the same as the length of the column. Returns0if it succeeded,1otherwise โgsl_matrix_set_row($m, $i, $v)โ copies the elements of vector$vinto the $i-th row of the matrix$m. The length of the vector must be the same as the length of the row. Returns0if it succeeded,1otherwise โgsl_matrix_set_col($m, $j, $v)โ copies the elements of vector$vinto the $j-th row of the matrix$m. The length of the vector must be the same as the length of the column. Returns0if it succeeded,1otherwise โ
These ones are all related to constant views of a matrix, bestie ๐ง
gsl_matrix_const_rowgsl_matrix_const_columngsl_matrix_const_diagonalgsl_matrix_const_subdiagonalgsl_matrix_const_superdiagonalgsl_matrix_const_subrowgsl_matrix_const_subcolumngsl_matrix_const_view_arraygsl_matrix_const_view_array_with_tda
Okay so the following functions are similar to the ones above but they work with char's and int's instead. And honestly? We are not quite sure if anyone actually wants these ๐ Please speak up if you do, and/or submit some patches to this documentation, please! ๐ซถ
gsl_matrix_const_view_vector
gsl_matrix_const_view_vector_with_tdagsl_matrix_char_allocgsl_matrix_char_callocgsl_matrix_char_alloc_from_blockgsl_matrix_char_alloc_from_matrixgsl_vector_char_alloc_row_from_matrixgsl_vector_char_alloc_col_from_matrixgsl_matrix_char_freegsl_matrix_char_submatrixgsl_matrix_char_rowgsl_matrix_char_columngsl_matrix_char_diagonalgsl_matrix_char_subdiagonalgsl_matrix_char_superdiagonalgsl_matrix_char_subrowgsl_matrix_char_subcolumngsl_matrix_char_view_arraygsl_matrix_char_view_array_with_tdagsl_matrix_char_view_vectorgsl_matrix_char_view_vector_with_tdagsl_matrix_char_const_submatrixgsl_matrix_char_const_rowgsl_matrix_char_const_columngsl_matrix_char_const_diagonalgsl_matrix_char_const_subdiagonalgsl_matrix_char_const_superdiagonalgsl_matrix_char_const_subrowgsl_matrix_char_const_subcolumngsl_matrix_char_const_view_arraygsl_matrix_char_const_view_array_with_tdagsl_matrix_char_const_view_vectorgsl_matrix_char_const_view_vector_with_tdagsl_matrix_char_getgsl_matrix_char_setgsl_matrix_char_ptrgsl_matrix_char_const_ptrgsl_matrix_char_set_zerogsl_matrix_char_set_identitygsl_matrix_char_set_allgsl_matrix_char_freadgsl_matrix_char_fwritegsl_matrix_char_fscanfgsl_matrix_char_fprintfgsl_matrix_char_memcpygsl_matrix_char_swapgsl_matrix_char_swap_rowsgsl_matrix_char_swap_columnsgsl_matrix_char_swap_rowcolgsl_matrix_char_transposegsl_matrix_char_transpose_memcpygsl_matrix_char_maxgsl_matrix_char_mingsl_matrix_char_minmaxgsl_matrix_char_max_indexgsl_matrix_char_min_indexgsl_matrix_char_minmax_indexgsl_matrix_char_isnullgsl_matrix_char_isposgsl_matrix_char_isneggsl_matrix_char_isnonneggsl_matrix_char_addgsl_matrix_char_subgsl_matrix_char_mul_elementsgsl_matrix_char_div_elementsgsl_matrix_char_scalegsl_matrix_char_add_constantgsl_matrix_char_add_diagonalgsl_matrix_int_allocgsl_matrix_int_callocgsl_matrix_int_alloc_from_blockgsl_matrix_int_alloc_from_matrixgsl_vector_int_alloc_row_from_matrixgsl_vector_int_alloc_col_from_matrixgsl_matrix_int_freegsl_matrix_int_submatrixgsl_matrix_int_rowgsl_matrix_int_columngsl_matrix_int_diagonalgsl_matrix_int_subdiagonalgsl_matrix_int_superdiagonalgsl_matrix_int_subrowgsl_matrix_int_subcolumngsl_matrix_int_view_arraygsl_matrix_int_view_array_with_tdagsl_matrix_int_view_vectorgsl_matrix_int_view_vector_with_tdagsl_matrix_int_const_submatrixgsl_matrix_int_const_rowgsl_matrix_int_const_columngsl_matrix_int_ptrgsl_matrix_int_const_ptrgsl_matrix_int_set_zerogsl_matrix_int_set_identitygsl_matrix_int_set_allgsl_matrix_int_freadgsl_matrix_int_fwritegsl_matrix_int_fscanfgsl_matrix_int_fprintfgsl_matrix_int_memcpygsl_matrix_int_swapgsl_matrix_int_swap_rowsgsl_matrix_int_swap_columnsgsl_matrix_int_swap_rowcolgsl_matrix_int_transposegsl_matrix_int_transpose_memcpygsl_matrix_int_maxgsl_matrix_int_mingsl_matrix_int_minmaxgsl_matrix_int_max_indexgsl_matrix_int_min_indexgsl_matrix_int_minmax_indexgsl_matrix_int_isnullgsl_matrix_int_isposgsl_matrix_int_isneggsl_matrix_int_isnonneggsl_matrix_int_addgsl_matrix_int_subgsl_matrix_int_mul_elementsgsl_matrix_int_div_elementsgsl_matrix_int_scalegsl_matrix_int_add_constantgsl_matrix_int_add_diagonal
okay bestie, that was the whole roster, no skips, no cuts ๐
You have to add the functions you want to use inside the qw /put_function_here /. You can also just write use Math::GSL::Matrix qw/:all/ and boom, every available function of the module is yours โจ. There are other tags too, and here is the complete list of all tags for this module:
"all""int""double""char""complex"
For more info on the functions, we're pointing you straight at the GSL official documentation: <http://www.gnu.org/software/gsl/manual/html_node/> ๐ซถ
๐ EXAMPLES ๐
Most of the examples in this section are Perl versions of the examples at <http://www.gnu.org/software/gsl/manual/html_node/Example-programs-for-matrices.html> ๐
The program below shows how to allocate, initialize and read from a matrix using the functions gsl_matrix_alloc, gsl_matrix_set and gsl_matrix_get.
use Math::GSL::Matrix qw/:all/;
my $m = gsl_matrix_alloc (10,3);
for my $i (0..9){
for my $j (0..2){
gsl_matrix_set($m, $i, $j, 0.23 + 100*$i + $j);
}
}
for my $i (0..99){ # OUT OF RANGE ERROR
for my $j (0..2){
print "m($i, $j) = " . gsl_matrix_get ($m, $i, $j) . "\n";
}
}
gsl_matrix_free ($m);
bestie look at that comment โ# OUT OF RANGE ERROR๐ญ the loop goes0..99on a matrix that only has 10 rows, so no cap, that's literally going off the edge. Read that as a warning, not a suggestion ๐
use Math::GSL::Matrix qw/:all/;
my $m = gsl_matrix_alloc (100, 100);
my $a = gsl_matrix_alloc (100, 100);
for my $i (0..99){
for my $j (0..99){
gsl_matrix_set ($m, $i, $j, 0.23 + $i + $j);
}
}
The next program shows how to write a matrix to a file ๐ฆ
my $out = gsl_fopen("test.dat", "wb");
gsl_matrix_fwrite ($out, $m);
gsl_fclose ($out);
my $in = gsl_fopen("test.dat", "rb");
gsl_matrix_fread ($in, $a);
gsl_fclose($in);
my $k=0;
for my $i (0..99){
for my $j (0..99){
$mij = gsl_matrix_get ($m, $i, $j);
$aij = gsl_matrix_get ($a, $i, $j);
$k++ if ($mij != $aij);
}
}
gsl_matrix_free($m);
gsl_matrix_free($a);
print "differences = $k (should be zero)\n";
write it out, read it back, count the differences, and the count should be zero โ that's the whole vibe check for your file I/O ๐ธ
๐ AUTHORS ๐
Jonathan "Duke" Leto <jonathan@leto.net> and Thierry Moisan <thierry.moisan@gmail.com>
๐ COPYRIGHT AND LICENSE ๐
Copyright (C) 2008-2024 Jonathan "Duke" Leto and Thierry Moisan
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
and that's the whole page, bestie, you made it to the end ๐ฅน this one came from the Perl v5.42.3 docs dated 2026-08-20, filed under Math::...:Matrix(3pm) โ go forth and multiply (matrices) ๐โจ
๐ฆ where this page comes from
- ubuntu stonking: libmath-gsl-perl 0.49-1build1 ยท Artistic-1.0-Perl OR GPL-1.0-or-later
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms