Mercurial > hg > octave-nkf
diff liboctave/Sparse-op-defs.h @ 6221:8e0f1eda266b
[project @ 2007-01-03 17:23:33 by jwe]
author | jwe |
---|---|
date | Wed, 03 Jan 2007 17:23:34 +0000 |
parents | 143b556ce725 |
children | 7e958a1532c6 |
line wrap: on
line diff
--- a/liboctave/Sparse-op-defs.h +++ b/liboctave/Sparse-op-defs.h @@ -24,6 +24,7 @@ #define octave_sparse_op_defs_h 1 #include "Array-util.h" +#include "mx-ops.h" #define SPARSE_BIN_OP_DECL(R, OP, X, Y) \ extern OCTAVE_API R OP (const X&, const Y&) @@ -473,7 +474,49 @@ octave_idx_type m2_nr = m2.rows (); \ octave_idx_type m2_nc = m2.cols (); \ \ - if (m1_nr != m2_nr || m1_nc != m2_nc) \ + if (m1_nr == 1 && m1_nc == 1) \ + { \ + if (m1.elem(0,0) == 0.) \ + r = R (m2); \ + else \ + { \ + r = R (m2_nr, m2_nc, m1.data(0) OP 0.); \ + \ + for (octave_idx_type j = 0 ; j < m2_nc ; j++) \ + { \ + OCTAVE_QUIT; \ + octave_idx_type idxj = j * m2_nr; \ + for (octave_idx_type i = m2.cidx(j) ; i < m2.cidx(j+1) ; i++) \ + { \ + OCTAVE_QUIT; \ + r.data(idxj + m2.ridx(i)) = m1.data(0) OP m2.data(i); \ + } \ + } \ + r.maybe_compress (); \ + } \ + } \ + else if (m2_nr == 1 && m2_nc == 1) \ + { \ + if (m2.elem(0,0) == 0.) \ + r = R (m1); \ + else \ + { \ + r = R (m1_nr, m1_nc, 0. OP m2.data(0)); \ + \ + for (octave_idx_type j = 0 ; j < m1_nc ; j++) \ + { \ + OCTAVE_QUIT; \ + octave_idx_type idxj = j * m1_nr; \ + for (octave_idx_type i = m1.cidx(j) ; i < m1.cidx(j+1) ; i++) \ + { \ + OCTAVE_QUIT; \ + r.data(idxj + m1.ridx(i)) = m1.data(i) OP m2.data(0); \ + } \ + } \ + r.maybe_compress (); \ + } \ + } \ + else if (m1_nr != m2_nr || m1_nc != m2_nc) \ gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ else \ { \ @@ -547,7 +590,41 @@ octave_idx_type m2_nr = m2.rows (); \ octave_idx_type m2_nc = m2.cols (); \ \ - if (m1_nr != m2_nr || m1_nc != m2_nc) \ + if (m1_nr == 1 && m1_nc == 1) \ + { \ + if (m1.elem(0,0) == 0.) \ + r = R (m2_nr, m2_nc); \ + else \ + { \ + r = R (m2); \ + octave_idx_type m2_nnz = m2.nnz(); \ + \ + for (octave_idx_type i = 0 ; i < m2_nnz ; i++) \ + { \ + OCTAVE_QUIT; \ + r.data (i) = m1.data(0) OP r.data(i); \ + } \ + r.maybe_compress (); \ + } \ + } \ + else if (m2_nr == 1 && m2_nc == 1) \ + { \ + if (m2.elem(0,0) == 0.) \ + r = R (m1_nr, m1_nc); \ + else \ + { \ + r = R (m1); \ + octave_idx_type m1_nnz = m1.nnz(); \ + \ + for (octave_idx_type i = 0 ; i < m1_nnz ; i++) \ + { \ + OCTAVE_QUIT; \ + r.data (i) = r.data(i) OP m2.data(0); \ + } \ + r.maybe_compress (); \ + } \ + } \ + else if (m1_nr != m2_nr || m1_nc != m2_nc) \ gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ else \ { \ @@ -611,7 +688,59 @@ octave_idx_type m2_nr = m2.rows (); \ octave_idx_type m2_nc = m2.cols (); \ \ - if (m1_nr != m2_nr || m1_nc != m2_nc) \ + if (m1_nr == 1 && m1_nc == 1) \ + { \ + if ((m1.elem (0,0) OP Complex()) == Complex()) \ + { \ + octave_idx_type m2_nnz = m2.nnz(); \ + r = R (m2); \ + for (octave_idx_type i = 0 ; i < m2_nnz ; i++) \ + r.data (i) = m1.elem(0,0) OP r.data(i); \ + r.maybe_compress (); \ + } \ + else \ + { \ + r = R (m2_nr, m2_nc, m1.elem(0,0) OP Complex ()); \ + for (octave_idx_type j = 0 ; j < m2_nc ; j++) \ + { \ + OCTAVE_QUIT; \ + octave_idx_type idxj = j * m2_nr; \ + for (octave_idx_type i = m2.cidx(j) ; i < m2.cidx(j+1) ; i++) \ + { \ + OCTAVE_QUIT; \ + r.data(idxj + m2.ridx(i)) = m1.elem(0,0) OP m2.data(i); \ + } \ + } \ + r.maybe_compress (); \ + } \ + } \ + else if (m2_nr == 1 && m2_nc == 1) \ + { \ + if ((Complex() OP m1.elem (0,0)) == Complex()) \ + { \ + octave_idx_type m1_nnz = m1.nnz(); \ + r = R (m1); \ + for (octave_idx_type i = 0 ; i < m1_nnz ; i++) \ + r.data (i) = r.data(i) OP m2.elem(0,0); \ + r.maybe_compress (); \ + } \ + else \ + { \ + r = R (m1_nr, m1_nc, Complex() OP m2.elem(0,0)); \ + for (octave_idx_type j = 0 ; j < m1_nc ; j++) \ + { \ + OCTAVE_QUIT; \ + octave_idx_type idxj = j * m1_nr; \ + for (octave_idx_type i = m1.cidx(j) ; i < m1.cidx(j+1) ; i++) \ + { \ + OCTAVE_QUIT; \ + r.data(idxj + m1.ridx(i)) = m1.data(i) OP m2.elem(0,0); \ + } \ + } \ + r.maybe_compress (); \ + } \ + } \ + else if (m1_nr != m2_nr || m1_nc != m2_nc) \ gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ else \ { \ @@ -698,7 +827,19 @@ octave_idx_type m2_nr = m2.rows (); \ octave_idx_type m2_nc = m2.cols (); \ \ - if (m1_nr == m2_nr && m1_nc == m2_nc) \ + if (m1_nr == 1 && m1_nc == 1) \ + { \ + extern OCTAVE_API SparseBoolMatrix F (const double&, const M2&); \ + extern OCTAVE_API SparseBoolMatrix F (const Complex&, const M2&); \ + r = F (m1.elem(0,0), m2); \ + } \ + else if (m2_nr == 1 && m2_nc == 1) \ + { \ + extern OCTAVE_API SparseBoolMatrix F (const M1&, const double&); \ + extern OCTAVE_API SparseBoolMatrix F (const M1&, const Complex&); \ + r = F (m1, m2.elem(0,0)); \ + } \ + else if (m1_nr == m2_nr && m1_nc == m2_nc) \ { \ if (m1_nr != 0 || m1_nc != 0) \ { \ @@ -764,7 +905,19 @@ octave_idx_type m2_nr = m2.rows (); \ octave_idx_type m2_nc = m2.cols (); \ \ - if (m1_nr == m2_nr && m1_nc == m2_nc) \ + if (m1_nr == 1 && m1_nc == 1) \ + { \ + extern OCTAVE_API SparseBoolMatrix F (const double&, const M2&); \ + extern OCTAVE_API SparseBoolMatrix F (const Complex&, const M2&); \ + r = F (m1.elem(0,0), m2); \ + } \ + else if (m2_nr == 1 && m2_nc == 1) \ + { \ + extern OCTAVE_API SparseBoolMatrix F (const M1&, const double&); \ + extern OCTAVE_API SparseBoolMatrix F (const M1&, const Complex&); \ + r = F (m1, m2.elem(0,0)); \ + } \ + else if (m1_nr == m2_nr && m1_nc == m2_nc) \ { \ if (m1_nr != 0 || m1_nc != 0) \ { \ @@ -836,7 +989,9 @@ octave_idx_type m2_nr = m2.rows (); \ octave_idx_type m2_nc = m2.cols (); \ \ - if (m1_nr != m2_nr || m1_nc != m2_nc) \ + if (m2_nr == 1 && m2_nc == 1) \ + r = R (m1 OP m2.elem(0,0)); \ + else if (m1_nr != m2_nr || m1_nc != m2_nc) \ gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ else \ { \ @@ -861,7 +1016,9 @@ octave_idx_type m2_nr = m2.rows (); \ octave_idx_type m2_nc = m2.cols (); \ \ - if (m1_nr != m2_nr || m1_nc != m2_nc) \ + if (m2_nr == 1 && m2_nc == 1) \ + r = R (m1 OP m2.elem(0,0)); \ + else if (m1_nr != m2_nr || m1_nc != m2_nc) \ gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ else \ { \ @@ -924,7 +1081,9 @@ octave_idx_type m2_nr = m2.rows (); \ octave_idx_type m2_nc = m2.cols (); \ \ - if (m1_nr == m2_nr && m1_nc == m2_nc) \ + if (m2_nr == 1 && m2_nc == 1) \ + r = SparseBoolMatrix (F (m1, m2.elem(0,0))); \ + else if (m1_nr == m2_nr && m1_nc == m2_nc) \ { \ if (m1_nr != 0 || m1_nc != 0) \ { \ @@ -990,7 +1149,9 @@ octave_idx_type m2_nr = m2.rows (); \ octave_idx_type m2_nc = m2.cols (); \ \ - if (m1_nr == m2_nr && m1_nc == m2_nc) \ + if (m2_nr == 1 && m2_nc == 1) \ + r = SparseBoolMatrix (F (m1, m2.elem(0,0))); \ + else if (m1_nr == m2_nr && m1_nc == m2_nc) \ { \ if (m1_nr != 0 || m1_nc != 0) \ { \ @@ -1062,7 +1223,9 @@ octave_idx_type m2_nr = m2.rows (); \ octave_idx_type m2_nc = m2.cols (); \ \ - if (m1_nr != m2_nr || m1_nc != m2_nc) \ + if (m1_nr == 1 && m1_nc == 1) \ + r = R (m1.elem(0,0) OP m2); \ + else if (m1_nr != m2_nr || m1_nc != m2_nc) \ gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ else \ { \ @@ -1087,7 +1250,9 @@ octave_idx_type m2_nr = m2.rows (); \ octave_idx_type m2_nc = m2.cols (); \ \ - if (m1_nr != m2_nr || m1_nc != m2_nc) \ + if (m1_nr == 1 && m1_nc == 1) \ + r = R (m1.elem(0,0) OP m2); \ + else if (m1_nr != m2_nr || m1_nc != m2_nc) \ gripe_nonconformant (#F, m1_nr, m1_nc, m2_nr, m2_nc); \ else \ { \ @@ -1150,7 +1315,9 @@ octave_idx_type m2_nr = m2.rows (); \ octave_idx_type m2_nc = m2.cols (); \ \ - if (m1_nr == m2_nr && m1_nc == m2_nc) \ + if (m1_nr == 1 && m1_nc == 1) \ + r = SparseBoolMatrix (F (m1.elem(0,0), m2)); \ + else if (m1_nr == m2_nr && m1_nc == m2_nc) \ { \ if (m1_nr != 0 || m1_nc != 0) \ { \ @@ -1216,7 +1383,9 @@ octave_idx_type m2_nr = m2.rows (); \ octave_idx_type m2_nc = m2.cols (); \ \ - if (m1_nr == m2_nr && m1_nc == m2_nc) \ + if (m1_nr == 1 && m1_nc == 1) \ + r = SparseBoolMatrix (F (m1.elem(0,0), m2)); \ + else if (m1_nr == m2_nr && m1_nc == m2_nc) \ { \ if (m1_nr != 0 || m1_nc != 0) \ { \ @@ -1540,7 +1709,49 @@ octave_idx_type a_nr = a.rows (); \ octave_idx_type a_nc = a.cols (); \ \ - if (nc != a_nr) \ + if (nr == 1 && nc == 1) \ + { \ + RET_EL_TYPE s = m.elem(0,0); \ + octave_idx_type nz = a.nnz(); \ + RET_TYPE r (a_nr, a_nc, nz); \ + \ + for (octave_idx_type i = 0; i < nz; i++) \ + { \ + OCTAVE_QUIT; \ + r.data(i) = s * a.data(i); \ + r.ridx(i) = a.ridx(i); \ + } \ + for (octave_idx_type i = 0; i < a_nc + 1; i++) \ + { \ + OCTAVE_QUIT; \ + r.cidx(i) = a.cidx(i); \ + } \ + \ + r.maybe_compress (true); \ + return r; \ + } \ + else if (a_nr == 1 && a_nc == 1) \ + { \ + RET_EL_TYPE s = a.elem(0,0); \ + octave_idx_type nz = m.nnz(); \ + RET_TYPE r (nr, nc, nz); \ + \ + for (octave_idx_type i = 0; i < nz; i++) \ + { \ + OCTAVE_QUIT; \ + r.data(i) = m.data(i) * s; \ + r.ridx(i) = m.ridx(i); \ + } \ + for (octave_idx_type i = 0; i < nc + 1; i++) \ + { \ + OCTAVE_QUIT; \ + r.cidx(i) = m.cidx(i); \ + } \ + \ + r.maybe_compress (true); \ + return r; \ + } \ + else if (nc != a_nr) \ { \ gripe_nonconformant ("operator *", nr, nc, a_nr, a_nc); \ return RET_TYPE (); \ @@ -1667,7 +1878,20 @@ octave_idx_type a_nr = a.rows (); \ octave_idx_type a_nc = a.cols (); \ \ - if (nc != a_nr) \ + if (nr == 1 && nc == 1) \ + { \ + RET_TYPE retval (a_nr, a_nc, ZERO); \ + for (octave_idx_type i = 0; i < a_nc ; i++) \ + { \ + for (octave_idx_type j = 0; j < a_nr; j++) \ + { \ + OCTAVE_QUIT; \ + retval.elem (j,i) += a.elem(j,i) * m.elem(0,0); \ + } \ + } \ + return retval; \ + } \ + else if (nc != a_nr) \ { \ gripe_nonconformant ("operator *", nr, nc, a_nr, a_nc); \ return RET_TYPE (); \ @@ -1697,7 +1921,20 @@ octave_idx_type a_nr = a.rows (); \ octave_idx_type a_nc = a.cols (); \ \ - if (nc != a_nr) \ + if (a_nr == 1 && a_nc == 1) \ + { \ + RET_TYPE retval (nr, nc, ZERO); \ + for (octave_idx_type i = 0; i < nc ; i++) \ + { \ + for (octave_idx_type j = 0; j < nr; j++) \ + { \ + OCTAVE_QUIT; \ + retval.elem (j,i) += a.elem(0,0) * m.elem(j,i); \ + } \ + } \ + return retval; \ + } \ + else if (nc != a_nr) \ { \ gripe_nonconformant ("operator *", nr, nc, a_nr, a_nc); \ return RET_TYPE (); \