SwaJime has asked for the wisdom of the Perl Monks concerning the following question:

Howdy,

I'm trying to use Math::Matrix, but I've run into a problem. When I run the code listed below, I get this error:

Can't locate object method "transpose" via package "4.21926979366246" +(perhaps you forgot to load "4.21926979366246"?) at /usr/local/share/ +perl/5.18.2/Math/Matrix.pm line 450.

The (extremely shortened) code:

#!/usr/bin/perl use warnings; use strict; use Math::Trig qw(:pi :radial); use Math::Matrix; my ($x,$y,$z) = (1,1,1); my $radius = 5; my $segments = 12; my ($rho, $theta, $phi) = cartesian_to_spherical($x, $y, $z); ($theta,$phi) = ($phi,$theta); my $n = Math::Matrix->new ([cos($phi)*sin($theta)], [sin($theta)*sin($phi)], [cos($theta)]); my $u = Math::Matrix->new ([-sin($phi)], [cos($phi)], [0]); my $n_x_u = Math::Matrix->new ([cos($theta)*cos($phi)], [cos($theta)*sin($phi)], [-sin($theta)]); my $center = Math::Matrix->new ([$x], [$y], [$z]); for (my $v = 0; $v < $segments; $v++) { my $angle = $v*pi2/$segments; my $point = $radius * cos($angle) * $u + $radius * sin($angle) * $n_x_u + $center; print $point->[0][0] . ", " . $point->[1][0] . ", " . $point->[2][0 +] . "\n"; }

Replies are listed 'Best First'.
Re: Math::Matrix - Error: Can't locate object method "transpose"
by SwaJime (Scribe) on Nov 19, 2015 at 15:20 UTC
    I figured out what I did wrong. The line should be
    my $point = $u->multiply_scalar($radius * cos($angle)) + $n_x_u->multiply_scalar($radius * sin($angle)) + $center;
    Still, I'm thinking this mistake should have been trapped for?
      You can also try to patch the source of Math::Matrix, making it overload x for multiply_scalar.
      diff --git a/lib/perl5/Math/Matrix.pm b/lib/perl5/Math/Matrix.pm index 0105845..1894a62 100644 --- a/lib/perl5/Math/Matrix.pm +++ b/lib/perl5/Math/Matrix.pm @@ -244,6 +244,7 @@ use strict; $VERSION = 0.8; use overload + 'x' => 'multiply_scalar', '~' => 'transpose', '+' => 'add', '-' => 'subtract',

      And then, voilą:

      use Math::Matrix; my $m = 'Math::Matrix'->new([0, 1, 2], [3, 4, 5], [6, 7, 8]); print $m x 2; __END__ Output: 0.00000 2.00000 4.00000 6.00000 8.00000 10.00000 12.00000 14.00000 16.00000

      Update: A bit more clever change added to the wishlist.

      ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,