# HG changeset patch
# User Jason Riedy
# Date 1236736489 14400
# Node ID 55d40cb27682ddf21a4c2f8d5d23f4a382956c4a
# Parent b12a3be04411cb55054fe556b7b20ed6969faac8
Have sparse LU return permutation matrices rather than sparse matrices.
This could well impact user code. It'd be interesting to see if there
is any actual fall-out... Quite often, the permutation matrices are
applied to *dense* vectors. Returning permutation matrices rather
than sparse matrices is a slight performance enhancement, but likely
lost in the noise.
diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog
--- a/liboctave/ChangeLog
+++ b/liboctave/ChangeLog
@@ -1,3 +1,13 @@
+2009-03-10 Jason Riedy
+
+ * sparse-base-lu.cc (Pr_mat): New member function. Return the row
+ permutation as a PermMatrix.
+ (Pc_mat): New member function. Return the col permutation as a
+ PermMatrix.
+
+ * sparse-base-lu.h (sparse_base_lu): Declare Pc_mat and Pr_mat
+ member functions.
+
2009-03-10 Jason Riedy
* Sparse-perm-op-defs.h (octinternal_do_mul_colpm_sm): New
diff --git a/liboctave/sparse-base-lu.cc b/liboctave/sparse-base-lu.cc
--- a/liboctave/sparse-base-lu.cc
+++ b/liboctave/sparse-base-lu.cc
@@ -98,6 +98,13 @@
}
template
+PermMatrix
+sparse_base_lu :: Pr_mat (void) const
+{
+ return PermMatrix (P, false);
+}
+
+template
p_type
sparse_base_lu :: Pc (void) const
{
@@ -131,6 +138,13 @@
return Pout;
}
+template
+PermMatrix
+sparse_base_lu :: Pc_mat (void) const
+{
+ return PermMatrix (Q, true);
+}
+
/*
;;; Local Variables: ***
;;; mode: C++ ***
diff --git a/liboctave/sparse-base-lu.h b/liboctave/sparse-base-lu.h
--- a/liboctave/sparse-base-lu.h
+++ b/liboctave/sparse-base-lu.h
@@ -70,6 +70,10 @@
ColumnVector Pr_vec (void) const;
+ PermMatrix Pc_mat (void) const;
+
+ PermMatrix Pr_mat (void) const;
+
const octave_idx_type * row_perm (void) const { return P.fortran_vec (); }
const octave_idx_type * col_perm (void) const { return Q.fortran_vec (); }
diff --git a/src/ChangeLog b/src/ChangeLog
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2009-03-10 Jason Riedy
+
+ * DLD-FUNCTIONS/lu.cc (lu): Call fact.Pr_mat () and fact.Pc_mat ()
+ to return permutation matrices in the sparse case.
+
2009-03-10 Jason Riedy
* OPERATORS/op-pm-sm.cc (mul_pm_sm): New Octave binding for
diff --git a/src/DLD-FUNCTIONS/lu.cc b/src/DLD-FUNCTIONS/lu.cc
--- a/src/DLD-FUNCTIONS/lu.cc
+++ b/src/DLD-FUNCTIONS/lu.cc
@@ -226,7 +226,7 @@
retval (0) = fact.Y ();
else
{
- SparseMatrix P = fact.Pr ();
+ PermMatrix P = fact.Pr_mat ();
SparseMatrix L = P.transpose () * fact.L ();
retval(1) = octave_value (fact.U (),
MatrixType (MatrixType::Upper));
@@ -245,7 +245,7 @@
if (vecout)
retval (2) = fact.Pr_vec ();
else
- retval(2) = fact.Pr ();
+ retval(2) = fact.Pr_mat ();
retval(1) = octave_value (fact.U (),
MatrixType (MatrixType::Upper));
@@ -269,8 +269,8 @@
}
else
{
- retval(3) = fact.Pc ();
- retval(2) = fact.Pr ();
+ retval(3) = fact.Pc_mat ();
+ retval(2) = fact.Pr_mat ();
}
retval(1) = octave_value (fact.U (),
MatrixType (MatrixType::Upper));
@@ -296,7 +296,7 @@
retval (0) = fact.Y ();
else
{
- SparseMatrix P = fact.Pr ();
+ PermMatrix P = fact.Pr_mat ();
SparseComplexMatrix L = P.transpose () * fact.L ();
retval(1) = octave_value (fact.U (),
MatrixType (MatrixType::Upper));
@@ -315,7 +315,7 @@
if (vecout)
retval (2) = fact.Pr_vec ();
else
- retval(2) = fact.Pr ();
+ retval(2) = fact.Pr_mat ();
retval(1) = octave_value (fact.U (),
MatrixType (MatrixType::Upper));
@@ -339,8 +339,8 @@
}
else
{
- retval(3) = fact.Pc ();
- retval(2) = fact.Pr ();
+ retval(3) = fact.Pc_mat ();
+ retval(2) = fact.Pr_mat ();
}
retval(1) = octave_value (fact.U (),
MatrixType (MatrixType::Upper));