Hi Luis,

The difference you’re seeing is due to a sort of mirage; when you transpose 
both outputs (suitable for matrix-multiplication) you’ll get the correct 
results, which are a 1x2 column vector.

However, the lu_backsub code was quite complicated and in ascertaining the 
above, and also making it work “inplace” (did you know that the current “copy” 
method when “inplace” just turns off “inplace” and returns the given ndarray?) 
with tests, I had to make some fixes and changes. Now the dims of the results 
will all be the same.

As soon as I’m confident these changes haven’t broken any other stuff, I’ll be 
releasing them. Thanks for the report!

Best regards,
Ed

From: Luis Mochan<mailto:[email protected]>
Sent: 29 May 2021 20:28
To: perldl<mailto:[email protected]>; 
perldl<mailto:[email protected]>
Subject: [Pdl-devel] lu_backsub

I found a strange behavior in lu_backsub from PDL::MatrixOps:

    pdl> my $M=pdl([1,2],[3,4]);
    pdl> my $M1=pdl([3,4],[1,2]); # interchange two rows
    pdl> my $y=pdl(1,1);
    pdl> my $x=lu_backsub($M->copy->lu_decomp, $y);
    pdl> my $x1=lu_backsub($M1->copy->lu_decomp, $y);
    pdl> p $x->info;
    PDL: Double D [2,1]
    pdl> p $x1->info;
    PDL: Double D [2]

In both cases I'm solving the same 2x2 system of equations using a 1D
vector as the right hand side, but in the second case I interchanged
rows, so I expected the same solution.  In the first case I get back a 'row
vector', i.e., a matrix with one row. However, in the second case I
got a real 1D vector, not a matrix.

My guess is that the problem is related to the code around line 1298
of matrixops.pd, which contains some warnings:

      if($nontrivial) {
         if($y->is_inplace) {
            $y .= $y->dummy(1,$y->dim(0))->index($perm->dummy(1,1))->sever;   # 
TODO: check threading
            $out = $y;
         } else {
            $out = $y->dummy(1,$y->dim(0))->index($perm->dummy(1,1))->sever;  # 
TODO: check threading
         }
      } else {
         # should check for more matrix dims to thread over
         # but ignore the issue for now
         $out = ($y->is_inplace ? $y : $y->copy);
      }
      print STDERR "lu_backsub: starting with \$out" . pdl($out->dims) . "\n" 
if $PDL::debug;


Best regards,
Luis


--

                                                                  o
W. Luis Mochán,                      | tel:(52)(777)329-1734     /<(*)
Instituto de Ciencias Físicas, UNAM  | fax:(52)(777)317-5388     `>/   /\
Av. Universidad s/n CP 62210         |                           (*)/\/  \
Cuernavaca, Morelos, México          | [email protected]   /\_/\__/
GPG: 791EB9EB, C949 3F81 6D9B 1191 9A16  C2DF 5F0A C52B 791E B9EB


_______________________________________________
pdl-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/pdl-devel

_______________________________________________
pdl-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/pdl-general

Reply via email to