36 ,
n_elem(in_n_rows*in_n_cols)
52 ,
n_elem(in_n_rows*in_n_cols)
75 const uword end_col_plus1 = start_col + local_n_cols;
79 for(i=start_col, j=start_col+1; j < end_col_plus1; i+=2, j+=2)
101 template<
typename eT>
111 if(local_n_rows == 1)
117 const uword end_col_plus1 = start_col + local_n_cols;
121 for(i=start_col, j=start_col+1; j < end_col_plus1; i+=2, j+=2)
127 if(i < end_col_plus1)
143 template<
typename eT>
153 if(local_n_rows == 1)
159 const uword end_col_plus1 = start_col + local_n_cols;
163 for(i=start_col, j=start_col+1; j < end_col_plus1; i+=2, j+=2)
169 if(i < end_col_plus1)
185 template<
typename eT>
195 if(local_n_rows == 1)
201 const uword end_col_plus1 = start_col + local_n_cols;
205 for(i=start_col, j=start_col+1; j < end_col_plus1; i+=2, j+=2)
211 if(i < end_col_plus1)
227 template<
typename eT>
228 template<
typename T1>
239 const uword t_n_rows = t.n_rows;
240 const uword t_n_cols = t.n_cols;
244 const bool alias = P.is_alias(t.m);
255 const eT* x_mem = x.
memptr();
264 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
266 A.
at(row, start_col+i) = x_mem[i];
267 A.
at(row, start_col+j) = x_mem[j];
272 A.
at(row, start_col+i) = x_mem[i];
294 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
299 A.
at(row, start_col+i) = tmp1;
300 A.
at(row, start_col+j) = tmp2;
312 eT* t_col_data = t.colptr(
col);
315 for(i=0, j=1; j<t_n_rows; i+=2, j+=2)
317 const eT tmp1 = P.at(i,
col);
318 const eT tmp2 = P.at(j,
col);
320 t_col_data[i] = tmp1;
321 t_col_data[j] = tmp2;
326 t_col_data[i] = P.at(i,
col);
335 template<
typename eT>
336 template<
typename T1>
347 const uword t_n_rows = t.n_rows;
348 const uword t_n_cols = t.n_cols;
352 const bool alias = P.is_alias(t.m);
363 const eT* x_mem = x.
memptr();
372 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
374 A.
at(row, start_col+i) += x_mem[i];
375 A.
at(row, start_col+j) += x_mem[j];
380 A.
at(row, start_col+i) += x_mem[i];
402 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
407 A.
at(row, start_col+i) += tmp1;
408 A.
at(row, start_col+j) += tmp2;
420 eT* t_col_data = t.colptr(
col);
423 for(i=0, j=1; j<t_n_rows; i+=2, j+=2)
425 const eT val1 = P.at(i,
col);
426 const eT val2 = P.at(j,
col);
428 t_col_data[i] += val1;
429 t_col_data[j] += val2;
434 t_col_data[i] += P.at(i,
col);
443 template<
typename eT>
444 template<
typename T1>
455 const uword t_n_rows = t.n_rows;
456 const uword t_n_cols = t.n_cols;
460 const bool alias = P.is_alias(t.m);
469 const eT* x_mem = x.
memptr();
478 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
480 A.
at(row, start_col+i) -= x_mem[i];
481 A.
at(row, start_col+j) -= x_mem[j];
486 A.
at(row, start_col+i) -= x_mem[i];
508 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
513 A.
at(row, start_col+i) -= tmp1;
514 A.
at(row, start_col+j) -= tmp2;
526 eT* t_col_data = t.colptr(
col);
529 for(i=0, j=1; j<t_n_rows; i+=2, j+=2)
531 const eT val1 = P.at(i,
col);
532 const eT val2 = P.at(j,
col);
534 t_col_data[i] -= val1;
535 t_col_data[j] -= val2;
540 t_col_data[i] -= P.at(i,
col);
549 template<
typename eT>
550 template<
typename T1>
561 const uword t_n_rows = t.n_rows;
562 const uword t_n_cols = t.n_cols;
566 const bool alias = P.is_alias(t.m);
577 const eT* x_mem = x.
memptr();
586 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
588 A.
at(row, start_col+i) *= x_mem[i];
589 A.
at(row, start_col+j) *= x_mem[j];
594 A.
at(row, start_col+i) *= x_mem[i];
616 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
621 A.
at(row, start_col+i) *= tmp1;
622 A.
at(row, start_col+j) *= tmp2;
634 eT* t_col_data = t.colptr(
col);
637 for(i=0, j=1; j<t_n_rows; i+=2, j+=2)
639 const eT val1 = P.at(i,
col);
640 const eT val2 = P.at(j,
col);
642 t_col_data[i] *= val1;
643 t_col_data[j] *= val2;
648 t_col_data[i] *= P.at(i,
col);
657 template<
typename eT>
658 template<
typename T1>
669 const uword t_n_rows = t.n_rows;
670 const uword t_n_cols = t.n_cols;
674 const bool alias = P.is_alias(t.m);
685 const eT* x_mem = x.
memptr();
694 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
696 A.
at(row, start_col+i) /= x_mem[i];
697 A.
at(row, start_col+j) /= x_mem[j];
702 A.
at(row, start_col+i) /= x_mem[i];
724 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
729 A.
at(row, start_col+i) /= tmp1;
730 A.
at(row, start_col+j) /= tmp2;
742 eT* t_col_data = t.colptr(
col);
745 for(i=0, j=1; j<t_n_rows; i+=2, j+=2)
747 const eT val1 = P.at(i,
col);
748 const eT val2 = P.at(j,
col);
750 t_col_data[i] /= val1;
751 t_col_data[j] /= val2;
756 t_col_data[i] /= P.at(i,
col);
766 template<
typename eT>
777 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
792 const uword row_B = x.aux_row1;
795 const uword start_col_B = x.aux_col1;
799 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
801 const eT tmp1 = B.
at(row_B, start_col_B + i);
802 const eT tmp2 = B.
at(row_B, start_col_B + j);
804 A.
at(row_A, start_col_A + i) = tmp1;
805 A.
at(row_A, start_col_A + j) = tmp2;
810 A.
at(row_A, start_col_A + i) = B.
at(row_B, start_col_B + i);
830 template<
typename eT>
841 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
863 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
865 const eT tmp1 = B.
at(row_B, start_col_B + i);
866 const eT tmp2 = B.
at(row_B, start_col_B + j);
868 A.
at(row_A, start_col_A + i) += tmp1;
869 A.
at(row_A, start_col_A + j) += tmp2;
874 A.
at(row_A, start_col_A + i) += B.
at(row_B, start_col_B + i);
894 template<
typename eT>
905 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
927 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
929 const eT tmp1 = B.
at(row_B, start_col_B + i);
930 const eT tmp2 = B.
at(row_B, start_col_B + j);
932 A.
at(row_A, start_col_A + i) -= tmp1;
933 A.
at(row_A, start_col_A + j) -= tmp2;
938 A.
at(row_A, start_col_A + i) -= B.
at(row_B, start_col_B + i);
959 template<
typename eT>
970 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
992 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
994 const eT tmp1 = B.
at(row_B, start_col_B + i);
995 const eT tmp2 = B.
at(row_B, start_col_B + j);
997 A.
at(row_A, start_col_A + i) *= tmp1;
998 A.
at(row_A, start_col_A + j) *= tmp2;
1003 A.
at(row_A, start_col_A + i) *= B.
at(row_B, start_col_B + i);
1024 template<
typename eT>
1035 const subview<eT>& x = overlap ? (*tmp_subview) : x_in;
1057 for(i=0, j=1; j < t_n_cols; i+=2, j+=2)
1059 const eT tmp1 = B.
at(row_B, start_col_B + i);
1060 const eT tmp2 = B.
at(row_B, start_col_B + j);
1062 A.
at(row_A, start_col_A + i) /= tmp1;
1063 A.
at(row_A, start_col_A + j) /= tmp2;
1068 A.
at(row_A, start_col_A + i) /= B.
at(row_B, start_col_B + i);
1089 template<
typename eT>
1099 if(local_n_rows == 1)
1105 const uword end_col_plus1 = start_col + local_n_cols;
1109 for(i=start_col, j=start_col+1; j < end_col_plus1; i+=2, j+=2)
1115 if(i < end_col_plus1)
1131 template<
typename eT>
1138 (*this).fill(eT(0));
1143 template<
typename eT>
1150 (*this).fill(eT(1));
1155 template<
typename eT>
1166 for(
uword i=0; i<N; ++i)
1174 template<
typename eT>
1188 template<
typename eT>
1197 return m.mem[index];
1202 template<
typename eT>
1218 template<
typename eT>
1229 return m.mem[index];
1234 template<
typename eT>
1247 template<
typename eT>
1255 return m.mem[index];
1260 template<
typename eT>
1271 template<
typename eT>
1277 return m.mem[index];
1282 template<
typename eT>
1292 template<
typename eT>
1302 template<
typename eT>
1322 const uword t_row_end_p1 = t_row_start + t.
n_rows;
1325 const uword t_col_end_p1 = t_col_start + t.
n_cols;
1329 const uword x_row_end_p1 = x_row_start + x.
n_rows;
1332 const uword x_col_end_p1 = x_col_start + x.
n_cols;
1335 const bool outside_rows = ( (x_row_start >= t_row_end_p1) || (t_row_start >= x_row_end_p1) );
1336 const bool outside_cols = ( (x_col_start >= t_col_end_p1) || (t_col_start >= x_col_end_p1) );
1338 return ( (outside_rows ==
false) && (outside_cols ==
false) );
1345 template<
typename eT>
1356 template<
typename eT>
1387 eT* out_mem = out.
memptr();
1394 for(i=0, j=1; j <
n_cols; i+=2, j+=2)
1396 const eT tmp1 = X.
at(row, start_col+i);
1397 const eT tmp2 = X.
at(row, start_col+j);
1405 out_mem[i] = X.
at(row, start_col+i);
1423 template<
typename eT>
1437 eT* out_mem = out.
memptr();
1445 for(i=0, j=1; j <
n_cols; i+=2, j+=2)
1447 const eT tmp1 = X.
at(row, start_col+i);
1448 const eT tmp2 = X.
at(row, start_col+j);
1456 out_mem[i] += X.
at(row, start_col+i);
1471 template<
typename eT>
1485 eT* out_mem = out.
memptr();
1493 for(i=0, j=1; j <
n_cols; i+=2, j+=2)
1495 const eT tmp1 = X.
at(row, start_col+i);
1496 const eT tmp2 = X.
at(row, start_col+j);
1504 out_mem[i] -= X.
at(row, start_col+i);
1519 template<
typename eT>
1533 eT* out_mem = out.
memptr();
1541 for(i=0, j=1; j <
n_cols; i+=2, j+=2)
1543 const eT tmp1 = X.
at(row, start_col+i);
1544 const eT tmp2 = X.
at(row, start_col+j);
1552 out_mem[i] *= X.
at(row, start_col+i);
1567 template<
typename eT>
1581 eT* out_mem = out.
memptr();
1589 for(i=0, j=1; j <
n_cols; i+=2, j+=2)
1591 const eT tmp1 = X.
at(row, start_col+i);
1592 const eT tmp2 = X.
at(row, start_col+j);
1600 out_mem[i] /= X.
at(row, start_col+i);
1615 template<
typename eT>
1632 template<
typename eT>
1648 template<
typename eT>
1655 const bool col_all = col_span.
whole;
1659 const uword in_col1 = col_all ? 0 : col_span.
a;
1660 const uword in_col2 = col_span.
b;
1661 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
1670 ( col_all ?
false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
1672 "subview::operator(): indices out of bounds or incorrectly used" 1680 template<
typename eT>
1687 const bool col_all = col_span.
whole;
1691 const uword in_col1 = col_all ? 0 : col_span.
a;
1692 const uword in_col2 = col_span.
b;
1693 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
1702 ( col_all ?
false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
1704 "subview::operator(): indices out of bounds or incorrectly used" 1713 template<
typename eT>
1730 template<
typename eT>
1746 template<
typename eT>
1753 const bool row_all = row_span.
whole;
1757 const uword in_row1 = row_all ? 0 : row_span.
a;
1758 const uword in_row2 = row_span.
b;
1759 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
1768 ( row_all ?
false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
1770 "subview::operator(): indices out of bounds or incorrectly used" 1778 template<
typename eT>
1785 const bool row_all = row_span.
whole;
1789 const uword in_row1 = row_all ? 0 : row_span.
a;
1790 const uword in_row2 = row_span.
b;
1791 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
1800 ( row_all ?
false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
1802 "subview::operator(): indices out of bounds or incorrectly used" 1815 template<
typename eT>
1834 template<
typename eT>
1849 template<
typename eT>
1858 (in_row1 > in_row2) || (in_row2 >=
n_rows),
1859 "subview::rows(): indices out of bounds or incorrectly used" 1862 const uword subview_n_rows = in_row2 - in_row1 + 1;
1871 template<
typename eT>
1880 (in_row1 > in_row2) || (in_row2 >=
n_rows),
1881 "subview::rows(): indices out of bounds or incorrectly used" 1884 const uword subview_n_rows = in_row2 - in_row1 + 1;
1893 template<
typename eT>
1902 (in_col1 > in_col2) || (in_col2 >=
n_cols),
1903 "subview::cols(): indices out of bounds or incorrectly used" 1906 const uword subview_n_cols = in_col2 - in_col1 + 1;
1915 template<
typename eT>
1924 (in_col1 > in_col2) || (in_col2 >=
n_cols),
1925 "subview::cols(): indices out of bounds or incorrectly used" 1928 const uword subview_n_cols = in_col2 - in_col1 + 1;
1937 template<
typename eT>
1946 (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >=
n_rows) || (in_col2 >=
n_cols),
1947 "subview::submat(): indices out of bounds or incorrectly used" 1950 const uword subview_n_rows = in_row2 - in_row1 + 1;
1951 const uword subview_n_cols = in_col2 - in_col1 + 1;
1956 return subview<eT>(*
m_ptr, base_row1, base_col1, subview_n_rows, subview_n_cols);
1962 template<
typename eT>
1971 (in_row1 > in_row2) || (in_col1 > in_col2) || (in_row2 >=
n_rows) || (in_col2 >=
n_cols),
1972 "subview::submat(): indices out of bounds or incorrectly used" 1975 const uword subview_n_rows = in_row2 - in_row1 + 1;
1976 const uword subview_n_cols = in_col2 - in_col1 + 1;
1981 return subview<eT>(
m, base_row1, base_col1, subview_n_rows, subview_n_cols);
1987 template<
typename eT>
1994 const bool row_all = row_span.
whole;
1995 const bool col_all = col_span.
whole;
2000 const uword in_row1 = row_all ? 0 : row_span.
a;
2001 const uword in_row2 = row_span.
b;
2002 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
2004 const uword in_col1 = col_all ? 0 : col_span.
a;
2005 const uword in_col2 = col_span.
b;
2006 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
2010 ( row_all ?
false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
2012 ( col_all ?
false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
2014 "subview::submat(): indices out of bounds or incorrectly used" 2020 return subview<eT>(*
m_ptr, base_row1, base_col1, submat_n_rows, submat_n_cols);
2026 template<
typename eT>
2033 const bool row_all = row_span.
whole;
2034 const bool col_all = col_span.
whole;
2039 const uword in_row1 = row_all ? 0 : row_span.
a;
2040 const uword in_row2 = row_span.
b;
2041 const uword submat_n_rows = row_all ? local_n_rows : in_row2 - in_row1 + 1;
2043 const uword in_col1 = col_all ? 0 : col_span.
a;
2044 const uword in_col2 = col_span.
b;
2045 const uword submat_n_cols = col_all ? local_n_cols : in_col2 - in_col1 + 1;
2049 ( row_all ?
false : ((in_row1 > in_row2) || (in_row2 >= local_n_rows)) )
2051 ( col_all ?
false : ((in_col1 > in_col2) || (in_col2 >= local_n_cols)) )
2053 "subview::submat(): indices out of bounds or incorrectly used" 2059 return subview<eT>(
m, base_row1, base_col1, submat_n_rows, submat_n_cols);
2064 template<
typename eT>
2071 return (*this).submat(row_span, col_span);
2076 template<
typename eT>
2083 return (*this).submat(row_span, col_span);
2089 template<
typename eT>
2096 const uword row_offset = (in_id < 0) ?
uword(-in_id) : 0;
2097 const uword col_offset = (in_id > 0) ?
uword( in_id) : 0;
2101 ((row_offset > 0) && (row_offset >=
n_rows)) || ((col_offset > 0) && (col_offset >=
n_cols)),
2102 "subview::diag(): requested diagonal out of bounds" 2116 template<
typename eT>
2123 const uword row_offset = (in_id < 0) ? -in_id : 0;
2124 const uword col_offset = (in_id > 0) ? in_id : 0;
2128 ((row_offset > 0) && (row_offset >=
n_rows)) || ((col_offset > 0) && (col_offset >=
n_cols)),
2129 "subview::diag(): requested diagonal out of bounds" 2137 return diagview<eT>(
m, base_row_offset, base_col_offset, len);
2142 template<
typename eT>
2152 "subview::swap_rows(): out of bounds" 2155 eT*
mem = (*m_ptr).memptr();
2163 const eT tmp = mem[pos1];
2171 template<
typename eT>
2181 "subview::swap_cols(): out of bounds" 2186 eT* ptr1 =
colptr(in_col1);
2187 eT* ptr2 =
colptr(in_col2);
2191 const eT tmp = ptr1[
row];
2264 template<
typename eT>
2274 template<
typename eT>
2284 template<
typename eT>
2287 :
subview<eT>(in_m, in_row1, in_col, in_n_rows, 1)
2294 template<
typename eT>
2297 :
subview<eT>(in_m, in_row1, in_col, in_n_rows, 1)
2304 template<
typename eT>
2317 template<
typename eT>
2330 template<
typename eT>
2331 template<
typename T1>
2344 template<
typename eT>
2353 const uword subview_n_rows = in_row2 - in_row1 + 1;
2362 template<
typename eT>
2371 const uword subview_n_rows = in_row2 - in_row1 + 1;
2380 template<
typename eT>
2389 const uword subview_n_rows = in_row2 - in_row1 + 1;
2398 template<
typename eT>
2407 const uword subview_n_rows = in_row2 - in_row1 + 1;
2422 template<
typename eT>
2432 template<
typename eT>
2442 template<
typename eT>
2445 :
subview<eT>(in_m, in_row, in_col1, 1, in_n_cols)
2452 template<
typename eT>
2455 :
subview<eT>(in_m, in_row, in_col1, 1, in_n_cols)
2462 template<
typename eT>
2475 template<
typename eT>
2488 template<
typename eT>
2489 template<
typename T1>
2502 template<
typename eT>
2511 const uword subview_n_cols = in_col2 - in_col1 + 1;
2520 template<
typename eT>
2529 const uword subview_n_cols = in_col2 - in_col1 + 1;
2538 template<
typename eT>
2547 const uword subview_n_cols = in_col2 - in_col1 + 1;
2556 template<
typename eT>
2565 const uword subview_n_cols = in_col2 - in_col1 + 1;
static void extract(Mat< eT > &out, const subview &in)
X = Y.submat(...)
subview_col< eT > subvec(const uword in_row1, const uword in_row2)
arma_inline arma_warn_unused eT * memptr()
returns a pointer to array of eTs used by the matrix
subview_col< eT > rows(const uword in_row1, const uword in_row2)
void operator/=(const eT val)
arma_hot static arma_inline void copy(eT *dest, const eT *src, const uword n_elem)
static void div_inplace(Mat< eT > &out, const subview &in)
X /= Y.submat(...)
arma_inline const derived & get_ref() const
subview_row< eT > subvec(const uword in_col1, const uword in_col2)
static arma_hot void inplace_minus(eT *dest, const eT *src, const uword n_elem)
arma_aligned Mat< eT > * m_ptr
const uword n_rows
number of rows in the field (read-only)
static arma_hot void inplace_mul(eT *dest, const eT *src, const uword n_elem)
const uword n_cols
number of columns in the field (read-only)
const uword n_cols
number of columns in the matrix (read-only)
static void minus_inplace(Mat< eT > &out, const subview &in)
X -= Y.submat(...)
void operator-=(const eT val)
#define arma_debug_assert_same_size
void operator%=(const Base< eT, T1 > &x)
const uword n_rows
number of rows in the matrix (read-only)
#define arma_extra_debug_print
arma_aligned oT ** mem
pointer to memory used by the object
arma_inline const Op< T1, op_min > min(const Base< typename T1::elem_type, T1 > &X, const uword dim=0)
Delayed 'minimum values' operation. The dimension, along which the minima are found, is set via 'dim'. For dim = 0, the minimum value of each column is found (i.e. searches by traversing across rows). For dim = 1, the minimum value of each row is found (i.e. searches by traversing across columns). The default is dim = 0.
void swap_rows(const uword in_row1, const uword in_row2)
arma_inline arma_warn_unused eT * colptr(const uword in_col)
returns a pointer to array of eTs for a specified column; no bounds check
static arma_hot void inplace_plus(eT *dest, const eT *src, const uword n_elem)
void operator+=(const eT val)
subview_row< eT > cols(const uword in_col1, const uword in_col2)
Class for column vectors (matrices with only one column)
#define arma_extra_debug_warn
static arma_inline T1 & rw(const T1 &x)
internal function to allow modification of data declared as read-only
void swap_cols(const uword in_col1, const uword in_col2)
static void plus_inplace(Mat< eT > &out, const subview &in)
X += Y.submat(...)
static arma_hot void inplace_div(eT *dest, const eT *src, const uword n_elem)
eT & operator()(const uword i)
diagview< eT > diag(const sword in_id=0)
creation of diagview (diagonal)
static arma_hot void inplace_set(eT *dest, const eT val, const uword n_elem)
arma_inline arma_warn_unused eT & at(const uword i)
linear element accessor (treats the matrix as a vector); no bounds check.
arma_aligned const Mat< eT > & m
arma_inline eT * colptr(const uword in_col)
subview_row< eT > row(const uword row_num)
creation of subview (row vector)
static void schur_inplace(Mat< eT > &out, const subview &in)
X %= Y.submat(...)
subview< eT > submat(const uword in_row1, const uword in_col1, const uword in_row2, const uword in_col2)
creation of subview (submatrix)
void operator=(const subview< eT > &x)
bool check_overlap(const subview &x) const
eT & at(const uword in_row, const uword in_col)
#define arma_extra_debug_sigprint
Col< eT > unsafe_col(const uword col_num)
void operator=(const subview< eT > &x)
eT & operator[](const uword i)
void operator=(const Base< eT, T1 > &x)
Class for storing data required to extract and set the diagonals of a matrix.
const uword n_elem
number of elements in the field (read-only)
arma_inline const Op< subview< eT >, op_htrans > t() const
subview< eT > cols(const uword in_col1, const uword in_col2)
creation of subview (submatrix comprised of specified column vectors)
void operator*=(const eT val)
subview< eT > rows(const uword in_row1, const uword in_row2)
creation of subview (submatrix comprised of specified row vectors)
subview_col< eT > col(const uword col_num)
creation of subview (column vector)