RosettaCodeData/Task/Singular-value-decomposition/Perl/singular-value-decomposition.pl
2024-10-16 18:07:41 -07:00

21 lines
736 B
Perl

# 20240920 Perl programming solution
use strict;
use warnings;
use Math::GSL::Matrix;
use Math::GSL::Linalg qw/gsl_linalg_SV_decomp/;
my $M = Math::GSL::Matrix->new(2, 2);
$M->set_elem(0,0,3)->set_elem(0,1,0)->set_elem(1,0,4)->set_elem(1,1,5);
my $V = Math::GSL::Matrix->new(2, 2);
my ($S, $work) = ( Math::GSL::Vector->new(2), Math::GSL::Vector->new(2) );
gsl_linalg_SV_decomp($M->raw, $V->raw, $S->raw, $work->raw);
print "U factor:\n";
for my $i (0 .. $M->rows - 1) { print join(", ",$M->row($i)->as_list),"\n" }
print "singular values:\n";
print join(", ", map { sprintf("%.10g", $_) } $S->as_list), "\n";
print "Vt factor:\n";
for my $i (0 .. $V->rows - 1) { print join(", ",$V->row($i)->as_list),"\n" }