43 template<
class Num_T>
class Vec;
45 template<
class Num_T>
class Mat;
55 Vec<Num_T>
operator+(
const Vec<Num_T> &v1,
const Vec<Num_T> &v2);
58 Vec<Num_T>
operator+(
const Vec<Num_T> &v, Num_T t);
61 Vec<Num_T>
operator+(Num_T t,
const Vec<Num_T> &v);
65 Vec<Num_T>
operator-(
const Vec<Num_T> &v1,
const Vec<Num_T> &v2);
68 Vec<Num_T>
operator-(
const Vec<Num_T> &v, Num_T t);
71 Vec<Num_T>
operator-(Num_T t,
const Vec<Num_T> &v);
74 Vec<Num_T>
operator-(
const Vec<Num_T> &v);
78 Num_T
dot(
const Vec<Num_T> &v1,
const Vec<Num_T> &v2);
81 Num_T
operator*(
const Vec<Num_T> &v1,
const Vec<Num_T> &v2);
91 Mat<Num_T>
outer_product(
const Vec<Num_T> &v1,
const Vec<Num_T> &v2,
92 bool hermitian =
false);
95 Vec<Num_T>
operator*(
const Vec<Num_T> &v, Num_T t);
98 Vec<Num_T>
operator*(Num_T t,
const Vec<Num_T> &v);
101 template<
class Num_T>
102 Vec<Num_T>
elem_mult(
const Vec<Num_T> &a,
const Vec<Num_T> &b);
104 template<
class Num_T>
105 Vec<Num_T>
elem_mult(
const Vec<Num_T> &a,
const Vec<Num_T> &b,
106 const Vec<Num_T> &c);
108 template<
class Num_T>
109 Vec<Num_T>
elem_mult(
const Vec<Num_T> &a,
const Vec<Num_T> &b,
110 const Vec<Num_T> &c,
const Vec<Num_T> &d);
113 template<
class Num_T>
117 template<
class Num_T>
119 const Vec<Num_T> &c, Vec<Num_T> &out);
121 template<
class Num_T>
123 const Vec<Num_T> &c,
const Vec<Num_T> &d,
127 template<
class Num_T>
130 template<
class Num_T>
131 Num_T
elem_mult_sum(
const Vec<Num_T> &a,
const Vec<Num_T> &b);
134 template<
class Num_T>
135 Vec<Num_T>
operator/(
const Vec<Num_T> &v, Num_T t);
137 template<
class Num_T>
138 Vec<Num_T>
operator/(Num_T t,
const Vec<Num_T> &v);
141 template<
class Num_T>
142 Vec<Num_T>
elem_div(
const Vec<Num_T> &a,
const Vec<Num_T> &b);
144 template<
class Num_T>
145 Vec<Num_T>
elem_div(Num_T t,
const Vec<Num_T> &v);
147 template<
class Num_T>
148 void elem_div_out(
const Vec<Num_T> &a,
const Vec<Num_T> &b, Vec<Num_T> &out);
150 template<
class Num_T>
151 Num_T
elem_div_sum(
const Vec<Num_T> &a,
const Vec<Num_T> &b);
154 template<
class Num_T>
155 Vec<Num_T>
concat(
const Vec<Num_T> &v, Num_T a);
157 template<
class Num_T>
158 Vec<Num_T>
concat(Num_T a,
const Vec<Num_T> &v);
160 template<
class Num_T>
161 Vec<Num_T>
concat(
const Vec<Num_T> &v1,
const Vec<Num_T> &v2);
163 template<
class Num_T>
164 Vec<Num_T>
concat(
const Vec<Num_T> &v1,
const Vec<Num_T> &v2,
165 const Vec<Num_T> &v3);
167 template<
class Num_T>
168 Vec<Num_T>
concat(
const Vec<Num_T> &v1,
const Vec<Num_T> &v2,
169 const Vec<Num_T> &v3,
const Vec<Num_T> &v4);
171 template<
class Num_T>
172 Vec<Num_T>
concat(
const Vec<Num_T> &v1,
const Vec<Num_T> &v2,
173 const Vec<Num_T> &v3,
const Vec<Num_T> &v4,
174 const Vec<Num_T> &v5);
243 template<
class Num_T>
284 void set(
const char *str);
286 void set(
const std::string &str);
304 const Num_T &
get(
int i)
const;
313 void set(
int i, Num_T t);
458 void del(
int i1,
int i2);
460 void ins(
int i, Num_T t);
517 std::vector<std::string> tokenize(
const std::string &str,
518 bool &abc_format)
const;
520 Num_T parse_token(
const std::string &s)
const;
522 void parse_abc_token(
const std::string &s, Num_T &a, Num_T &b,
525 bool in_range(
int i)
const {
return ((i <
datasize) && (i >= 0)); }
578 template<
class Num_T>
579 std::ostream &operator<<(std::ostream &os, const Vec<Num_T> &v);
592 template<
class Num_T>
599 template<
class Num_T>
inline
612 template<
class Num_T>
inline
620 template<
class Num_T>
inline
623 template<
class Num_T>
inline
630 template<
class Num_T>
inline
637 template<
class Num_T>
inline
644 template<
class Num_T>
inline
647 set(std::string(str));
650 template<
class Num_T>
inline
656 template<
class Num_T>
inline
660 copy_vector(size, c_array,
data);
663 template<
class Num_T>
inline
669 template<
class Num_T>
672 it_assert_debug(size >= 0,
"Vec::set_size(): New size must not be negative");
673 if (datasize == size)
679 int old_datasize = datasize;
681 int min = datasize < size ? datasize :
size;
685 copy_vector(min, tmp, data);
687 for (
int i = min; i <
size; ++i)
698 template<
class Num_T>
inline
705 template<
class Num_T>
inline
711 template<
class Num_T>
inline
718 template<
class Num_T>
inline
724 template<
class Num_T>
inline
727 if (i1 == -1) i1 = datasize - 1;
728 if (i2 == -1) i2 = datasize - 1;
731 "Vec<>::operator()(i1, i2): Indexing out of range");
739 template<
class Num_T>
744 for (
int i = 0; i <
size; ++i) {
746 "Index i=" << i <<
" out of range");
747 temp(i) = data[indexlist(i)];
752 template<
class Num_T>
757 "Wrong size of binlist vector");
760 for (
int i = 0; i <
size; ++i)
761 if (binlist(i) ==
bin(1))
768 template<
class Num_T>
inline
774 template<
class Num_T>
inline
777 return (*
this)(i1, i2);
780 template<
class Num_T>
inline
783 return (*
this)(indexlist);
786 template<
class Num_T>
inline
789 return (*
this)(binlist);
792 template<
class Num_T>
inline
795 for (
int i = 0; i < datasize; i++)
799 template<
class Num_T>
inline
802 for (
int i = 0; i < datasize; i++)
806 template<
class Num_T>
inline
826 template<
class Num_T>
829 it_error(
"Vec::set(): Only `double', `complex<double>', `int', "
830 "`short int' and `bin' types supported");
833 template<
class Num_T>
inline
836 set(std::string(str));
840 template<
class Num_T>
844 copy_vector(datasize, data, temp.
_data());
853 template<
class Num_T>
857 copy_vector(datasize, data, temp.
_data());
861 template<
class Num_T>
867 copy_vector(datasize, v.
data, data);
872 for (
int i = 0; i < datasize; i++)
873 data[i] += v.
data[i];
878 template<
class Num_T>
inline
881 for (
int i = 0;i < datasize;i++)
886 template<
class Num_T>
899 template<
class Num_T>
911 template<
class Num_T>
923 template<
class Num_T>
929 for (
int i = 0; i < v.
datasize; i++)
930 data[i] = -v.
data[i];
935 for (
int i = 0; i < datasize; i++)
936 data[i] -= v.
data[i];
941 template<
class Num_T>
inline
944 for (
int i = 0;i < datasize;i++)
949 template<
class Num_T>
962 template<
class Num_T>
974 template<
class Num_T>
986 template<
class Num_T>
998 template<
class Num_T>
inline
1001 scal_vector(datasize, t, data);
1008 double dot(
const vec &v1,
const vec &v2);
1011 template<
class Num_T>
1016 for (
int i = 0; i < v1.
datasize; ++i)
1021 template<
class Num_T>
inline
1033 cmat
outer_product(
const cvec &v1,
const cvec &v2,
bool hermitian);
1036 template<
class Num_T>
1040 "Vec::outer_product:: Input vector of zero size");
1043 for (
int i = 0; i < v1.
datasize; ++i) {
1044 for (
int j = 0; j < v2.
datasize; ++j) {
1051 template<
class Num_T>
1062 template<
class Num_T>
inline
1068 template<
class Num_T>
inline
1076 template<
class Num_T>
inline
1085 template<
class Num_T>
inline
1094 template<
class Num_T>
1098 "Vec<>::elem_mult_out(): Wrong sizes");
1100 for (
int i = 0; i < a.
datasize; i++)
1104 template<
class Num_T>
1109 "Vec<>::elem_mult_out(): Wrong sizes");
1111 for (
int i = 0; i < a.
datasize; i++)
1115 template<
class Num_T>
1121 "Vec<>::elem_mult_out(): Wrong sizes");
1123 for (
int i = 0; i < a.
datasize; i++)
1127 template<
class Num_T>
1134 "Vec<>::elem_mult_inplace(): Wrong sizes");
1135 for (
int i = 0; i < a.
datasize; i++)
1139 template<
class Num_T>
inline
1143 "Vec<>::elem_mult_sum(): Wrong sizes");
1145 for (
int i = 0; i < a.
datasize; i++)
1150 template<
class Num_T>
1162 template<
class Num_T>
1174 template<
class Num_T>
1177 it_warning(
"Vec<>::elem_div(Num_T, const Vec<Num_T> &): This function is "
1178 "deprecated and might be removed from future IT++ releases. "
1179 "Please use Vec<>::operator/(Num_T, const Vec<Num_T> &) "
1184 template<
class Num_T>
inline
1187 for (
int i = 0; i < datasize; ++i) {
1193 template<
class Num_T>
inline
1197 for (
int i = 0; i < datasize; ++i) {
1198 data[i] /= v.
data[i];
1203 template<
class Num_T>
inline
1211 template<
class Num_T>
1218 for (
int i = 0; i < a.
datasize; i++)
1222 template<
class Num_T>
inline
1229 for (
int i = 0; i < a.
datasize; i++)
1235 template<
class Num_T>
1241 copy_vector(nr, &data[datasize-nr], temp.
data);
1246 template<
class Num_T>
1252 copy_vector(nr, data, temp.
data);
1257 template<
class Num_T>
1261 "Vec::mid(): indexing out of range");
1264 copy_vector(nr, &data[start], temp.
data);
1269 template<
class Num_T>
1273 "Vec<>::split(): Index out of range");
1276 copy_vector(pos, data, temp1.
data);
1277 if (pos < datasize) {
1279 copy_vector(datasize - pos, &data[pos], temp2.
data);
1289 template<
class Num_T>
1296 data[i] = data[i-n];
1301 template<
class Num_T>
1304 for (
int i = datasize - 1; i >= v.
datasize; i--)
1306 for (
int i = 0; i < v.
datasize; i++)
1310 template<
class Num_T>
1316 for (i = 0; i < datasize - n; i++)
1317 data[i] = data[i+n];
1318 while (i < datasize)
1322 template<
class Num_T>
1325 for (
int i = 0; i < datasize - v.
datasize; i++)
1327 for (
int i = datasize - v.
datasize; i < datasize; i++)
1328 data[i] = v[i-datasize+v.
datasize];
1331 template<
class Num_T>
1336 copy_vector(size, v.
data, temp.
data);
1341 template<
class Num_T>
1347 copy_vector(size, v.
data, &temp.
data[1]);
1351 template<
class Num_T>
1354 int size1 = v1.
size();
1355 int size2 = v2.
size();
1357 copy_vector(size1, v1.
data, temp.
data);
1358 copy_vector(size2, v2.
data, &temp.
data[size1]);
1362 template<
class Num_T>
1366 int size1 = v1.
size();
1367 int size2 = v2.
size();
1368 int size3 = v3.
size();
1370 copy_vector(size1, v1.
data, temp.
data);
1371 copy_vector(size2, v2.
data, &temp.
data[size1]);
1372 copy_vector(size3, v3.
data, &temp.
data[size1+size2]);
1376 template<
class Num_T>
1380 int size1 = v1.
size();
1381 int size2 = v2.
size();
1382 int size3 = v3.
size();
1383 int size4 = v4.
size();
1384 Vec<Num_T> temp(size1 + size2 + size3 + size4);
1385 copy_vector(size1, v1.
data, temp.
data);
1386 copy_vector(size2, v2.
data, &temp.
data[size1]);
1387 copy_vector(size3, v3.
data, &temp.
data[size1+size2]);
1388 copy_vector(size4, v4.
data, &temp.
data[size1+size2+size3]);
1392 template<
class Num_T>
1397 int size1 = v1.
size();
1398 int size2 = v2.
size();
1399 int size3 = v3.
size();
1400 int size4 = v4.
size();
1401 int size5 = v5.
size();
1402 Vec<Num_T> temp(size1 + size2 + size3 + size4 + size5);
1403 copy_vector(size1, v1.
data, temp.
data);
1404 copy_vector(size2, v2.
data, &temp.
data[size1]);
1405 copy_vector(size3, v3.
data, &temp.
data[size1+size2]);
1406 copy_vector(size4, v4.
data, &temp.
data[size1+size2+size3]);
1407 copy_vector(size5, v5.
data, &temp.
data[size1+size2+size3+size4]);
1411 template<
class Num_T>
1414 it_warning(
"Vec<>::set_subvector(int, int, const Vec<> &): This function "
1415 "is deprecated and might be removed from future IT++ releases. "
1416 "Please use Vec<>::set_subvector(int, const Vec<> &) instead.");
1417 set_subvector(i1, v);
1420 template<
class Num_T>
inline
1424 "Vec<>::set_subvector(int, const Vec<> &): "
1425 "Index out of range or too long input vector");
1429 template<
class Num_T>
inline
1432 if (i1 == -1) i1 = datasize - 1;
1433 if (i2 == -1) i2 = datasize - 1;
1435 "Vec<>::set_subvector(int, int, Num_T): Indexing out "
1437 for (
int i = i1; i <= i2; i++)
1441 template<
class Num_T>
inline
1444 set_subvector(i, v);
1447 template<
class Num_T>
1450 it_assert_debug(in_range(index),
"Vec<>::del(int): Index out of range");
1452 set_size(datasize - 1,
false);
1453 copy_vector(index, temp.
data, data);
1454 copy_vector(datasize - index, &temp.
data[index+1], &data[index]);
1457 template<
class Num_T>
1460 if (i1 == -1) i1 = datasize - 1;
1461 if (i2 == -1) i2 = datasize - 1;
1463 "Vec<>::del(int, int): Indexing out of range");
1465 int new_size = datasize - (i2 - i1 + 1);
1466 set_size(new_size,
false);
1467 copy_vector(i1, temp.
data, data);
1468 copy_vector(datasize - i1, &temp.
data[i2+1], &data[i1]);
1471 template<
class Num_T>
1475 "Vec<>::ins(): Index out of range");
1478 set_size(datasize + 1,
false);
1479 copy_vector(index, Temp.
data, data);
1481 copy_vector(Temp.
datasize - index, Temp.
data + index, data + index + 1);
1484 template<
class Num_T>
1488 "Vec<>::ins(): Index out of range");
1491 set_size(datasize + v.
length(),
false);
1492 copy_vector(index, Temp.
data, data);
1493 copy_vector(v.
size(), v.
data, &data[index]);
1494 copy_vector(Temp.
datasize - index, Temp.
data + index, data + index + v.
size());
1497 template<
class Num_T>
inline
1500 for (
int i = 0;i < datasize;i++)
1505 template<
class Num_T>
inline
1510 copy_vector(datasize, v.
data, data);
1515 template<
class Num_T>
1518 if (m.
cols() == 1) {
1519 set_size(m.
rows(),
false);
1522 else if (m.
rows() == 1) {
1523 set_size(m.
cols(),
false);
1527 it_error(
"Vec<>::operator=(Mat<Num_T> &): Wrong size of input matrix");
1531 template<
class Num_T>
inline
1534 set(std::string(str));
1538 template<
class Num_T>
inline
1545 template<
class Num_T>
1549 bvec temp(datasize);
1550 for (
int i = 0; i < datasize; i++)
1551 temp(i) = (data[i] == t);
1555 template<
class Num_T>
1559 bvec temp(datasize);
1560 for (
int i = 0; i < datasize; i++)
1561 temp(i) = (data[i] != t);
1570 template<
class Num_T>
1574 bvec temp(datasize);
1575 for (
int i = 0; i < datasize; i++)
1576 temp(i) = (data[i] < t);
1585 template<
class Num_T>
1589 bvec temp(datasize);
1590 for (
int i = 0; i < datasize; i++)
1591 temp(i) = (data[i] <= t);
1600 template<
class Num_T>
1604 bvec temp(datasize);
1605 for (
int i = 0; i < datasize; i++)
1606 temp(i) = (data[i] > t);
1615 template<
class Num_T>
1619 bvec temp(datasize);
1620 for (
int i = 0; i < datasize; i++)
1621 temp(i) = (data[i] >= t);
1625 template<
class Num_T>
1629 if (datasize != invector.
datasize)
return false;
1630 for (
int i = 0;i < datasize;i++) {
1631 if (data[i] != invector.
data[i])
return false;
1636 template<
class Num_T>
1639 if (datasize != invector.
datasize)
return true;
1640 for (
int i = 0;i < datasize;i++) {
1641 if (data[i] != invector.
data[i])
return true;
1647 template<
class Num_T>
1648 std::ostream &operator<<(std::ostream &os, const Vec<Num_T> &v)
1653 for (i = 0; i < sz; i++) {
1664 template<
class Num_T>
1667 std::ostringstream buffer;
1668 bool started =
false;
1669 bool finished =
false;
1670 bool brackets =
false;
1680 if (is.eof() || (c ==
'\n')) {
1683 is.setstate(std::ios_base::failbit);
1686 else if (!((c ==
'\n') && !started)) {
1690 else if ((c ==
' ') || (c ==
'\t')) {
1695 else if (c ==
'[') {
1698 is.setstate(std::ios_base::failbit);
1706 else if (c ==
']') {
1707 if (!started || !brackets) {
1709 is.setstate(std::ios_base::failbit);
1715 while (!is.eof() && (((c =
static_cast<char>(is.peek())) ==
' ')
1719 if (!is.eof() && (c ==
'\n')) {
1734 v.
set(buffer.str());
1746 template<
class Num_T>
1747 void Vec<Num_T>::parse_abc_token(
const std::string &s, Num_T &a, Num_T &b,
1750 std::string::size_type beg = 0;
1751 std::string::size_type end = s.find(
':', 0);
1752 a = parse_token(s.substr(beg, end-beg));
1754 end = s.find(
':', beg);
1755 if (end != std::string::npos) {
1756 b = parse_token(s.substr(beg, end-beg));
1757 c = parse_token(s.substr(end+1, s.size()-end));
1761 c = parse_token(s.substr(beg, end-beg-1));
1765 template<
class Num_T>
1766 Num_T Vec<Num_T>::parse_token(
const std::string &s)
const
1768 it_error(
"Vec::parse_token(): Only `double' and `int' types are supported");
1773 double Vec<double>::parse_token(
const std::string &s)
const;
1775 int Vec<int>::parse_token(
const std::string &s)
const;
1784 extern template class Vec<double>;
1785 extern template class Vec<int>;
1786 extern template class Vec<short int>;
1787 extern template class Vec<std::complex<double> >;
1788 extern template class Vec<bin>;
1792 extern template vec
operator+(
const vec &v1,
const vec &v2);
1793 extern template cvec
operator+(
const cvec &v1,
const cvec &v2);
1794 extern template ivec
operator+(
const ivec &v1,
const ivec &v2);
1795 extern template svec
operator+(
const svec &v1,
const svec &v2);
1796 extern template bvec
operator+(
const bvec &v1,
const bvec &v2);
1798 extern template vec
operator+(
const vec &v1,
double t);
1799 extern template cvec
operator+(
const cvec &v1, std::complex<double> t);
1800 extern template ivec
operator+(
const ivec &v1,
int t);
1801 extern template svec
operator+(
const svec &v1,
short t);
1802 extern template bvec
operator+(
const bvec &v1, bin t);
1804 extern template vec
operator+(
double t,
const vec &v1);
1805 extern template cvec
operator+(std::complex<double> t,
const cvec &v1);
1806 extern template ivec
operator+(
int t,
const ivec &v1);
1807 extern template svec
operator+(
short t,
const svec &v1);
1808 extern template bvec
operator+(bin t,
const bvec &v1);
1812 extern template vec
operator-(
const vec &v1,
const vec &v2);
1813 extern template cvec
operator-(
const cvec &v1,
const cvec &v2);
1814 extern template ivec
operator-(
const ivec &v1,
const ivec &v2);
1815 extern template svec
operator-(
const svec &v1,
const svec &v2);
1816 extern template bvec
operator-(
const bvec &v1,
const bvec &v2);
1818 extern template vec
operator-(
const vec &v,
double t);
1819 extern template cvec
operator-(
const cvec &v, std::complex<double> t);
1820 extern template ivec
operator-(
const ivec &v,
int t);
1821 extern template svec
operator-(
const svec &v,
short t);
1822 extern template bvec
operator-(
const bvec &v, bin t);
1824 extern template vec
operator-(
double t,
const vec &v);
1825 extern template cvec
operator-(std::complex<double> t,
const cvec &v);
1826 extern template ivec
operator-(
int t,
const ivec &v);
1827 extern template svec
operator-(
short t,
const svec &v);
1828 extern template bvec
operator-(bin t,
const bvec &v);
1832 extern template vec
operator-(
const vec &v);
1833 extern template cvec
operator-(
const cvec &v);
1834 extern template ivec
operator-(
const ivec &v);
1835 extern template svec
operator-(
const svec &v);
1836 extern template bvec
operator-(
const bvec &v);
1840 extern template std::complex<double>
dot(
const cvec &v1,
const cvec &v2);
1841 extern template int dot(
const ivec &v1,
const ivec &v2);
1842 extern template short dot(
const svec &v1,
const svec &v2);
1843 extern template bin
dot(
const bvec &v1,
const bvec &v2);
1845 extern template double operator*(
const vec &v1,
const vec &v2);
1846 extern template std::complex<double>
operator*(
const cvec &v1,
const cvec &v2);
1847 extern template int operator*(
const ivec &v1,
const ivec &v2);
1848 extern template short operator*(
const svec &v1,
const svec &v2);
1849 extern template bin
operator*(
const bvec &v1,
const bvec &v2);
1851 extern template imat
outer_product(
const ivec &v1,
const ivec &v2,
1853 extern template smat
outer_product(
const svec &v1,
const svec &v2,
1858 extern template vec
operator*(
const vec &v,
double t);
1859 extern template cvec
operator*(
const cvec &v, std::complex<double> t);
1860 extern template ivec
operator*(
const ivec &v,
int t);
1861 extern template svec
operator*(
const svec &v,
short t);
1862 extern template bvec
operator*(
const bvec &v, bin t);
1864 extern template vec
operator*(
double t,
const vec &v);
1865 extern template cvec
operator*(std::complex<double> t,
const cvec &v);
1866 extern template ivec
operator*(
int t,
const ivec &v);
1867 extern template svec
operator*(
short t,
const svec &v);
1868 extern template bvec
operator*(bin t,
const bvec &v);
1872 extern template vec
elem_mult(
const vec &a,
const vec &b);
1873 extern template cvec
elem_mult(
const cvec &a,
const cvec &b);
1874 extern template ivec
elem_mult(
const ivec &a,
const ivec &b);
1875 extern template svec
elem_mult(
const svec &a,
const svec &b);
1876 extern template bvec
elem_mult(
const bvec &a,
const bvec &b);
1878 extern template void elem_mult_out(
const vec &a,
const vec &b, vec &out);
1879 extern template void elem_mult_out(
const cvec &a,
const cvec &b, cvec &out);
1880 extern template void elem_mult_out(
const ivec &a,
const ivec &b, ivec &out);
1881 extern template void elem_mult_out(
const svec &a,
const svec &b, svec &out);
1882 extern template void elem_mult_out(
const bvec &a,
const bvec &b, bvec &out);
1884 extern template vec
elem_mult(
const vec &a,
const vec &b,
const vec &c);
1885 extern template cvec
elem_mult(
const cvec &a,
const cvec &b,
const cvec &c);
1886 extern template ivec
elem_mult(
const ivec &a,
const ivec &b,
const ivec &c);
1887 extern template svec
elem_mult(
const svec &a,
const svec &b,
const svec &c);
1888 extern template bvec
elem_mult(
const bvec &a,
const bvec &b,
const bvec &c);
1890 extern template void elem_mult_out(
const vec &a,
const vec &b,
1891 const vec &c, vec &out);
1892 extern template void elem_mult_out(
const cvec &a,
const cvec &b,
1893 const cvec &c, cvec &out);
1894 extern template void elem_mult_out(
const ivec &a,
const ivec &b,
1895 const ivec &c, ivec &out);
1896 extern template void elem_mult_out(
const svec &a,
const svec &b,
1897 const svec &c, svec &out);
1898 extern template void elem_mult_out(
const bvec &a,
const bvec &b,
1899 const bvec &c, bvec &out);
1901 extern template vec
elem_mult(
const vec &a,
const vec &b,
1902 const vec &c,
const vec &d);
1903 extern template cvec
elem_mult(
const cvec &a,
const cvec &b,
1904 const cvec &c,
const cvec &d);
1905 extern template ivec
elem_mult(
const ivec &a,
const ivec &b,
1906 const ivec &c,
const ivec &d);
1907 extern template svec
elem_mult(
const svec &a,
const svec &b,
1908 const svec &c,
const svec &d);
1909 extern template bvec
elem_mult(
const bvec &a,
const bvec &b,
1910 const bvec &c,
const bvec &d);
1912 extern template void elem_mult_out(
const vec &a,
const vec &b,
const vec &c,
1913 const vec &d, vec &out);
1914 extern template void elem_mult_out(
const cvec &a,
const cvec &b,
1915 const cvec &c,
const cvec &d, cvec &out);
1916 extern template void elem_mult_out(
const ivec &a,
const ivec &b,
1917 const ivec &c,
const ivec &d, ivec &out);
1918 extern template void elem_mult_out(
const svec &a,
const svec &b,
1919 const svec &c,
const svec &d, svec &out);
1920 extern template void elem_mult_out(
const bvec &a,
const bvec &b,
1921 const bvec &c,
const bvec &d, bvec &out);
1933 extern template double elem_mult_sum(
const vec &a,
const vec &b);
1934 extern template std::complex<double>
elem_mult_sum(
const cvec &a,
1936 extern template int elem_mult_sum(
const ivec &a,
const ivec &b);
1937 extern template short elem_mult_sum(
const svec &a,
const svec &b);
1938 extern template bin
elem_mult_sum(
const bvec &a,
const bvec &b);
1942 extern template vec
operator/(
const vec &v,
double t);
1943 extern template cvec
operator/(
const cvec &v, std::complex<double> t);
1944 extern template ivec
operator/(
const ivec &v,
int t);
1945 extern template svec
operator/(
const svec &v,
short t);
1946 extern template bvec
operator/(
const bvec &v, bin t);
1948 extern template vec
operator/(
double t,
const vec &v);
1949 extern template cvec
operator/(std::complex<double> t,
const cvec &v);
1950 extern template ivec
operator/(
int t,
const ivec &v);
1951 extern template svec
operator/(
short t,
const svec &v);
1952 extern template bvec
operator/(bin t,
const bvec &v);
1956 extern template vec
elem_div(
const vec &a,
const vec &b);
1957 extern template cvec
elem_div(
const cvec &a,
const cvec &b);
1958 extern template ivec
elem_div(
const ivec &a,
const ivec &b);
1959 extern template svec
elem_div(
const svec &a,
const svec &b);
1960 extern template bvec
elem_div(
const bvec &a,
const bvec &b);
1962 extern template vec
elem_div(
double t,
const vec &v);
1963 extern template cvec
elem_div(std::complex<double> t,
const cvec &v);
1964 extern template ivec
elem_div(
int t,
const ivec &v);
1965 extern template svec
elem_div(
short t,
const svec &v);
1966 extern template bvec
elem_div(bin t,
const bvec &v);
1968 extern template void elem_div_out(
const vec &a,
const vec &b, vec &out);
1969 extern template void elem_div_out(
const cvec &a,
const cvec &b, cvec &out);
1970 extern template void elem_div_out(
const ivec &a,
const ivec &b, ivec &out);
1971 extern template void elem_div_out(
const svec &a,
const svec &b, svec &out);
1972 extern template void elem_div_out(
const bvec &a,
const bvec &b, bvec &out);
1976 extern template double elem_div_sum(
const vec &a,
const vec &b);
1977 extern template std::complex<double>
elem_div_sum(
const cvec &a,
1979 extern template int elem_div_sum(
const ivec &a,
const ivec &b);
1980 extern template short elem_div_sum(
const svec &a,
const svec &b);
1981 extern template bin
elem_div_sum(
const bvec &a,
const bvec &b);
1985 extern template vec
concat(
const vec &v,
double a);
1986 extern template cvec
concat(
const cvec &v, std::complex<double> a);
1987 extern template ivec
concat(
const ivec &v,
int a);
1988 extern template svec
concat(
const svec &v,
short a);
1989 extern template bvec
concat(
const bvec &v, bin a);
1991 extern template vec
concat(
double a,
const vec &v);
1992 extern template cvec
concat(std::complex<double> a,
const cvec &v);
1993 extern template ivec
concat(
int a,
const ivec &v);
1994 extern template svec
concat(
short a,
const svec &v);
1995 extern template bvec
concat(bin a,
const bvec &v);
1997 extern template vec
concat(
const vec &v1,
const vec &v2);
1998 extern template cvec
concat(
const cvec &v1,
const cvec &v2);
1999 extern template ivec
concat(
const ivec &v1,
const ivec &v2);
2000 extern template svec
concat(
const svec &v1,
const svec &v2);
2001 extern template bvec
concat(
const bvec &v1,
const bvec &v2);
2003 extern template vec
concat(
const vec &v1,
const vec &v2,
const vec &v3);
2004 extern template cvec
concat(
const cvec &v1,
const cvec &v2,
const cvec &v3);
2005 extern template ivec
concat(
const ivec &v1,
const ivec &v2,
const ivec &v3);
2006 extern template svec
concat(
const svec &v1,
const svec &v2,
const svec &v3);
2007 extern template bvec
concat(
const bvec &v1,
const bvec &v2,
const bvec &v3);
2009 extern template vec
concat(
const vec &v1,
const vec &v2,
2010 const vec &v3,
const vec &v4);
2011 extern template cvec
concat(
const cvec &v1,
const cvec &v2,
2012 const cvec &v3,
const cvec &v4);
2013 extern template ivec
concat(
const ivec &v1,
const ivec &v2,
2014 const ivec &v3,
const ivec &v4);
2015 extern template svec
concat(
const svec &v1,
const svec &v2,
2016 const svec &v3,
const svec &v4);
2017 extern template bvec
concat(
const bvec &v1,
const bvec &v2,
2018 const bvec &v3,
const bvec &v4);
2020 extern template vec
concat(
const vec &v1,
const vec &v2,
const vec &v3,
2021 const vec &v4,
const vec &v5);
2022 extern template cvec
concat(
const cvec &v1,
const cvec &v2,
const cvec &v3,
2023 const cvec &v4,
const cvec &v5);
2024 extern template ivec
concat(
const ivec &v1,
const ivec &v2,
const ivec &v3,
2025 const ivec &v4,
const ivec &v5);
2026 extern template svec
concat(
const svec &v1,
const svec &v2,
const svec &v3,
2027 const svec &v4,
const svec &v5);
2028 extern template bvec
concat(
const bvec &v1,
const bvec &v2,
const bvec &v3,
2029 const bvec &v4,
const bvec &v5);
2033 extern template std::ostream &
operator<<(std::ostream& os,
const vec &vect);
2034 extern template std::ostream &
operator<<(std::ostream& os,
const cvec &vect);
2035 extern template std::ostream &
operator<<(std::ostream& os,
const svec &vect);
2036 extern template std::ostream &
operator<<(std::ostream& os,
const ivec &vect);
2037 extern template std::ostream &
operator<<(std::ostream& os,
const bvec &vect);
2038 extern template std::istream &
operator>>(std::istream& is, vec &vect);
2039 extern template std::istream &
operator>>(std::istream& is, cvec &vect);
2040 extern template std::istream &
operator>>(std::istream& is, svec &vect);
2041 extern template std::istream &
operator>>(std::istream& is, ivec &vect);
2042 extern template std::istream &
operator>>(std::istream& is, bvec &vect);
2050 #endif // #ifndef VEC_H