26#if ! defined (octave_Sparse_diag_op_defs_h)
27#define octave_Sparse_diag_op_defs_h 1
29#include "octave-config.h"
35template <
typename RT,
typename DM,
typename SM>
45 octave::err_nonconformant (
"operator *", nr, nc, a_nr, a_nc);
47 RT r (nr, a_nc, a.nnz ());
59 r.xdata (l) =
d.dgelem (i) * a.data (k);
67 r.maybe_compress (
true);
71template <
typename RT,
typename SM,
typename DM>
81 octave::err_nonconformant (
"operator *", a_nr, a_nc, nr, nc);
84 RT r (a_nr, nc, a.cidx (mnc));
88 const typename DM::element_type s =
d.dgelem (j);
90 r.xcidx (j) = a.cidx (j);
93 r.xdata (k) = s * a.data (k);
94 r.xridx (k) = a.ridx (k);
98 r.xcidx (j) = a.cidx (mnc);
100 r.maybe_compress (
true);
116template <
typename RT,
typename SM,
typename DM,
typename OpA,
typename OpD>
128 RT r (a_nr, a_nc, nz + n);
138 for (k_split = k_src; k_split < colend; k_split++)
139 if (a.ridx (k_split) >= j)
142 for (; k_src < k_split; k_src++, k++)
144 r.xridx (k) = a.ridx (k_src);
145 r.xdata (k) = opa (a.data (k_src));
148 if (k_src < colend && a.ridx (k_src) == j)
151 r.xdata (k) = opa (a.data (k_src)) + opd (
d.dgelem (j));
157 r.xdata (k) = opd (
d.dgelem (j));
161 for (; k_src < colend; k_src++, k++)
163 r.xridx (k) = a.ridx (k_src);
164 r.xdata (k) = opa (a.data (k_src));
170 r.maybe_compress (
true);
174template <
typename RT,
typename SM,
typename DM,
typename OpA,
typename OpD>
188 r.elem (i, j) = opa (a.elem (0, j));
190 r.elem (i, j) = opa (a.elem (0, j)) + opd (
d.dgelem (j));
194 r.maybe_compress (
true);
198template <
typename RT,
typename SM,
typename DM,
typename OpA,
typename OpD>
212 r.elem (i, j) = opa (a.elem (i, 0));
214 r.elem (i, j) = opa (a.elem (i, 0)) + opd (
d.dgelem (j));
218 r.maybe_compress (
true);
222template <
typename RT,
typename DM,
typename SM>
225 if (a.rows () ==
d.rows () && a.cols () ==
d.cols ())
226 return inner_do_add_sm_dm<RT> (a,
d,
229 else if (a.rows () ==
d.rows () && a.cols () == 1)
230 return inner_do_add_col_sm_dm<RT> (a,
d,
233 else if (a.cols () ==
d.cols () && a.rows () == 1)
234 return inner_do_add_row_sm_dm<RT> (a,
d,
238 octave::err_nonconformant (
"operator +",
239 d.rows (),
d.cols (), a.rows (), a.cols ());
242template <
typename RT,
typename DM,
typename SM>
245 if (a.rows () ==
d.rows () && a.cols () ==
d.cols ())
246 return inner_do_add_sm_dm<RT> (a,
d,
247 std::negate<typename SM::element_type> (),
249 else if (a.rows () ==
d.rows () && a.cols () == 1)
250 return inner_do_add_col_sm_dm<RT> (a,
d,
251 std::negate<typename SM::element_type> (),
253 else if (a.cols () ==
d.cols () && a.rows () == 1)
254 return inner_do_add_row_sm_dm<RT> (a,
d,
255 std::negate<typename SM::element_type> (),
258 octave::err_nonconformant (
"operator -",
259 d.rows (),
d.cols (), a.rows (), a.cols ());
262template <
typename RT,
typename SM,
typename DM>
265 if (a.rows () ==
d.rows () && a.cols () ==
d.cols ())
266 return inner_do_add_sm_dm<RT> (a,
d,
269 else if (a.rows () ==
d.rows () && a.cols () == 1)
270 return inner_do_add_col_sm_dm<RT> (a,
d,
273 else if (a.cols () ==
d.cols () && a.rows () == 1)
274 return inner_do_add_row_sm_dm<RT> (a,
d,
278 octave::err_nonconformant (
"operator +",
279 d.rows (),
d.cols (), a.rows (), a.cols ());
282template <
typename RT,
typename SM,
typename DM>
285 if (a.rows () ==
d.rows () && a.cols () ==
d.cols ())
286 return inner_do_add_sm_dm<RT> (a,
d,
288 std::negate<typename DM::element_type> ());
289 else if (a.rows () ==
d.rows () && a.cols () == 1)
290 return inner_do_add_col_sm_dm<RT> (a,
d,
292 std::negate<typename DM::element_type> ());
293 else if (a.cols () ==
d.cols () && a.rows () == 1)
294 return inner_do_add_row_sm_dm<RT> (a,
d,
296 std::negate<typename DM::element_type> ());
298 octave::err_nonconformant (
"operator -",
299 d.rows (),
d.cols (), a.rows (), a.cols ());
RT inner_do_add_col_sm_dm(const SM &a, const DM &d, OpA opa, OpD opd)
RT inner_do_add_sm_dm(const SM &a, const DM &d, OpA opa, OpD opd)
RT do_sub_sm_dm(const SM &a, const DM &d)
RT do_add_sm_dm(const SM &a, const DM &d)
RT inner_do_add_row_sm_dm(const SM &a, const DM &d, OpA opa, OpD opd)
RT do_add_dm_sm(const DM &d, const SM &a)
RT do_sub_dm_sm(const DM &d, const SM &a)
RT do_mul_sm_dm(const SM &a, const DM &d)
RT do_mul_dm_sm(const DM &d, const SM &a)
charNDArray min(char d, const charNDArray &m)
F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE * d
F77_RET_T const F77_DBLE * x