75 #ifndef SLIP_CONVOLUTION_HPP
76 #define SLIP_CONVOLUTION_HPP
132 template <
typename SrcIter,
typename KernelIter,
typename ResIter>
136 KernelIter kernel_first,
137 KernelIter kernel_last,
138 std::size_t ksize_left,
139 std::size_t ksize_right,
142 assert(static_cast<std::size_t>(kernel_last - kernel_first) == (ksize_left + ksize_right + 1));
143 SrcIter first_offset = first + ksize_left;
144 SrcIter last_offset = last - ksize_right;
145 std::size_t K = ksize_left + ksize_right + 1;
146 for(;first_offset < last_offset; ++first_offset, ++result)
148 SrcIter first_offset_tmp = first_offset - ksize_left;
149 SrcIter last_offset_tmp = first_offset_tmp + K;
150 std::reverse_iterator<KernelIter> kernel_last_tmp =
151 std::reverse_iterator<KernelIter>(kernel_last);
155 typename std::iterator_traits<ResIter>::value_type());
190 template <
typename SrcIter,
typename KernelIter,
typename ResIter>
194 KernelIter kernel_first,
195 KernelIter kernel_last,
199 std::size_t K =
static_cast<std::size_t
>(kernel_last - kernel_first - 1);
203 kernel_first,kernel_last,
209 std::reverse_iterator<KernelIter> rkernel_last_tmp =
210 std::reverse_iterator<KernelIter>(kernel_last);
212 for(
size_t i = 0; i < K; ++i)
214 *(result + i ) =
std::inner_product(first,first + i + 1,rkernel_last_tmp + (K - i),
typename std::iterator_traits<ResIter>::value_type());
218 SrcIter first_tmp = last - K;
219 ResIter result_tmp = result + (last - first);
220 rkernel_last_tmp = std::reverse_iterator<KernelIter>(kernel_last);
222 for(
size_t i = 0; i < K; ++i)
224 *(result_tmp + i) =
std::inner_product(first_tmp + i,last,rkernel_last_tmp,
typename std::iterator_traits<ResIter>::value_type());
297 template <
typename SrcIter,
typename KernelIter,
typename ResIter>
301 KernelIter kernel_first,
302 KernelIter kernel_last,
303 std::size_t ksize_left,
304 std::size_t ksize_right,
310 kernel_first,kernel_last,
311 ksize_left,ksize_right,
312 result + ksize_right);
317 std::size_t K = ksize_left + ksize_right;
319 for(
size_t i = 0; i < ksize_right; ++i)
321 *(result + (ksize_right - i - 1)) =
std::inner_product(first,first + (K - i),std::reverse_iterator<KernelIter>(kernel_last - i - 1),
typename std::iterator_traits<ResIter>::value_type());
325 SrcIter first_tmp = last - K;
326 ResIter result_tmp = result + ((last - first) - ksize_left);
327 for(
size_t i = 0; i < ksize_left; ++i)
329 *(result_tmp + i) =
std::inner_product(first_tmp + i,last,std::reverse_iterator<KernelIter>(kernel_last),
typename std::iterator_traits<ResIter>::value_type());
337 std::size_t K = ksize_left + ksize_right;
338 typedef typename std::iterator_traits<ResIter>::value_type res_value_type;
339 typedef typename std::iterator_traits<SrcIter>::value_type src_value_type;
340 typedef typename std::iterator_traits<KernelIter>::value_type k_value_type;
347 std::reverse_iterator<KernelIter> rkernel =
348 std::reverse_iterator<KernelIter>(kernel_last);
350 std::vector<k_value_type> accu_vec(ksize_right);
351 std::partial_sum(rkernel,rkernel + ksize_right,accu_vec.begin());
353 res_value_type left_bvalue = src_value_type(*first);
354 for(
size_t i = 0; i < ksize_right; ++i)
357 *(result + (ksize_right - i - 1)) =
360 std::reverse_iterator<KernelIter>(kernel_last - i - 1),
361 res_value_type(accu_vec[i]) * left_bvalue);
368 KernelIter rkernel2 = kernel_last - K - 1;
370 std::vector<k_value_type> accu_vec2(ksize_left);
371 std::partial_sum(rkernel2,rkernel2 + ksize_left,accu_vec2.begin());
372 res_value_type right_bvalue = src_value_type(*(last - 1));
373 SrcIter first_tmp = last - K;
374 ResIter result_tmp = result + ((last - first) - ksize_left);
375 for(
size_t i = 0; i < ksize_left; ++i)
380 std::reverse_iterator<KernelIter>(kernel_last),
381 res_value_type(accu_vec2[i]) * right_bvalue);
388 for(
size_t i = 0; i < ksize_right; ++i)
390 *(result + (ksize_right - i - 1)) =
391 typename std::iterator_traits<ResIter>::value_type();
394 ResIter result_tmp = result + ((last - first) - ksize_left);
395 for(
size_t i = 0; i < ksize_left; ++i)
398 typename std::iterator_traits<ResIter>::value_type();
404 typedef typename std::iterator_traits<SrcIter>::value_type src_value_type;
406 std::size_t kernel_size = ksize_right + ksize_left + 1;
407 std::size_t tmp_size = ksize_right + ksize_right+ksize_left;
411 for(
size_t i = 0; i < tmp_size-ksize_right; ++i)
413 tmp_data[i+ksize_right]=*(first+i);
415 for(
size_t i = 0; i < ksize_right; ++i)
417 tmp_data[ksize_right-i-1]=*(last-i-1);
421 for(
size_t i = 0; i < ksize_right; ++i)
423 *(result + i)=
std::inner_product(tmp_data.
begin() + i,tmp_data.
begin() + i + kernel_size,std::reverse_iterator<KernelIter>(kernel_last),
typename std::iterator_traits<ResIter>::value_type());
426 std::size_t tmp_size2 = ksize_left + ksize_left+ksize_right;
429 for(
size_t i = 0; i < tmp_size2-ksize_left; ++i)
431 tmp_data2[ksize_right+ksize_left-i-1]=*(last-i-1);
433 for(
size_t i = 0; i < ksize_left; ++i)
435 tmp_data2[ksize_right+ksize_left+i]=*(first+i);
438 for(
size_t i = 0; i < ksize_left; ++i)
440 *(result + ((last - first) - ksize_left) + i)=
std::inner_product(tmp_data2.
begin() + i,tmp_data2.
begin() + i + kernel_size,std::reverse_iterator<KernelIter>(kernel_last),
typename std::iterator_traits<ResIter>::value_type());
445 std::size_t K = ksize_left + ksize_right;
447 for(
size_t i = 0; i < ksize_right; ++i)
449 *(result + (ksize_right - i - 1)) =
std::inner_product(first,first + (K - i),std::reverse_iterator<KernelIter>(kernel_last - i - 1),
typename std::iterator_traits<ResIter>::value_type());
453 SrcIter first_tmp = last - K;
454 ResIter result_tmp = result + ((last - first) - ksize_left);
455 for(
size_t i = 0; i < ksize_left; ++i)
457 *(result_tmp + i) =
std::inner_product(first_tmp + i,last,std::reverse_iterator<KernelIter>(kernel_last),
typename std::iterator_traits<ResIter>::value_type());
541 template <
typename SrcIter,
typename KernelIter,
typename ResIter>
545 KernelIter kernel_first,
546 KernelIter kernel_last,
551 std::size_t ksize_left = (kernel_last - kernel_first)/ 2;
552 std::size_t ksize_right = (kernel_last - kernel_first - 1) - ksize_left;
600 template <
typename Vector1,
typename Vector2,
typename Vector3>
603 const Vector2& Kernel,
648 template<
typename RandomAccessIterator1,
649 typename RandomAccessIterator2,
650 typename RandomAccessIterator3>
653 RandomAccessIterator2 first2, RandomAccessIterator2 last2,
654 RandomAccessIterator3 conv_first, RandomAccessIterator3 conv_last )
656 assert((last - first) == (last2 - first2));
657 assert((last - first) == (conv_last - conv_first));
658 assert((last - first) == (last2 - first2));
660 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
664 std::size_t N =
static_cast<std::size_t
>(last-first);
673 std::transform(fft2.
begin(),fft2.
end(),conv_first,
708 template<
typename RandomAccessIterator1,
typename RandomAccessIterator2,
typename RandomAccessIterator3>
711 RandomAccessIterator2 first2, RandomAccessIterator2 last2,
712 RandomAccessIterator3 conv_first, RandomAccessIterator3 conv_last )
715 assert((last - first) != 0);
716 assert((last2 - first2) != 0);
717 assert((conv_last-conv_first) >= (last - first) + (last2 - first2) -1);
718 typedef typename std::iterator_traits<RandomAccessIterator1>::difference_type _Difference1;
719 _Difference1 size1 = last - first;
720 typedef typename std::iterator_traits<RandomAccessIterator2>::difference_type _Difference2;
721 _Difference2 size2 = last2 - first2;
723 _Difference1 size = size1 + _Difference1(size2) - 1;
726 typedef typename std::iterator_traits<RandomAccessIterator1>::value_type value_type;
772 template <
typename Vector1,
typename Vector2,
typename Vector3>
774 const Vector2& Kernel,
780 Kernel.begin(),Kernel.end(),
781 Result.begin(),Result.end());
837 template <
typename RandomAccessIterator2d1,
838 typename KernelIter1,
839 typename KernelIter2,
840 typename RandomAccessIterator2d2>
843 RandomAccessIterator2d1 I_bot,
844 KernelIter1 k1_first,
846 std::size_t ksize_left1,
847 std::size_t ksize_right1,
849 KernelIter2 k2_first,
851 std::size_t ksize_left2,
852 std::size_t ksize_right2,
854 RandomAccessIterator2d2 R_up)
857 typename RandomAccessIterator2d1::difference_type size2d =
859 typedef typename RandomAccessIterator2d1::size_type size_type;
860 typedef typename RandomAccessIterator2d1::value_type value_type;
861 size_type nb_rows = size2d[0];
862 size_type nb_cols = size2d[1];
865 for(size_type i = 0; i < nb_rows; ++i)
875 for(size_type j = 0; j < nb_cols; ++j)
926 template <
typename RandomAccessIterator2d1,
927 typename KernelIter1,
928 typename KernelIter2,
929 typename RandomAccessIterator2d2>
932 RandomAccessIterator2d1 I_bot,
933 KernelIter1 k1_first,
935 KernelIter2 k2_first,
937 RandomAccessIterator2d2 R_up,
940 std::size_t size1 = (k1_last-k1_first)/2;
941 std::size_t size1_bis = (k1_last-k1_first) - 1 - size1;
942 std::size_t size2 = (k2_last-k2_first)/2;
943 std::size_t size2_bis = (k2_last-k2_first) - 1 - size2;
991 template <
typename Container1,
996 const Kernel1& kernel1,
997 const Kernel2& kernel2,
1004 Signal.bottom_right(),
1005 kernel1.begin(),kernel1.end(),
1006 kernel2.begin(),kernel2.end(),
1007 Result.upper_left());
1055 template <
typename RandomAccessIterator2d1,
1056 typename KernelIter1,
1057 typename KernelIter2>
1060 RandomAccessIterator2d1 I_bot,
1061 KernelIter1 k1_first,
1062 KernelIter1 k1_last,
1063 std::size_t ksize_left1,
1064 std::size_t ksize_right1,
1066 KernelIter2 k2_first,
1067 KernelIter2 k2_last,
1068 std::size_t ksize_left2,
1069 std::size_t ksize_right2,
1073 typename RandomAccessIterator2d1::difference_type size2d =
1075 typedef typename RandomAccessIterator2d1::size_type size_type;
1076 typedef typename RandomAccessIterator2d1::value_type value_type;
1077 const size_type nb_rows = size2d[0];
1078 const size_type nb_cols = size2d[1];
1082 for(size_type i = 0; i < nb_rows; ++i)
1093 for(size_type j = 0; j < nb_cols; ++j)
1137 template <
typename RandomAccessIterator2d1,
1138 typename KernelIter1,
1139 typename KernelIter2,
1140 typename RandomAccessIterator2d2>
1143 RandomAccessIterator2d1 I_bot,
1144 KernelIter1 k1_first,
1145 KernelIter1 k1_last,
1146 KernelIter2 k2_first,
1147 KernelIter2 k2_last,
1148 RandomAccessIterator2d2 R_up)
1150 typename RandomAccessIterator2d1::difference_type size2d =
1152 typedef typename RandomAccessIterator2d1::size_type size_type;
1153 typedef typename RandomAccessIterator2d1::value_type value_type;
1154 size_type nb_rows = size2d[0];
1155 size_type nb_cols = size2d[1];
1156 size_type size1 = (k1_last - k1_first);
1157 size_type size2 = (k2_last - k2_first);
1158 size_type size2o2 = size2/2;
1162 for(
size_t i = 0; i < nb_rows; ++i)
1168 for(
size_t j = 0; j < nb_cols; ++j)
1172 Vtmp.begin(),Vtmp.end());
1173 std::copy(Vtmp.begin()+size2o2,Vtmp.end()-size2o2,R_up.col_begin(j));
1202 template <
typename Container1,
1205 typename Container2>
1207 const Kernel1& kernel1,
1208 const Kernel2& kernel2,
1214 Signal.bottom_right(),
1215 kernel1.begin(),kernel1.end(),
1216 kernel2.begin(),kernel2.end(),
1217 Result.upper_left());
1269 template <
typename SrcIter2d,
1270 typename KernelIter2d,
1275 KernelIter2d kernel_up,
1276 KernelIter2d kernel_bot,
1277 std::size_t ksize_left,
1278 std::size_t ksize_right,
1279 std::size_t ksize_up,
1280 std::size_t ksize_bot,
1285 assert((R_bot - R_up)[0] == ((S_bot - S_up)[0] - (kernel_bot - kernel_up)[0] + 1));
1286 assert((R_bot - R_up)[1] == ((S_bot - S_up)[1] - (kernel_bot - kernel_up)[1] + 1));
1287 assert(static_cast<int>((kernel_bot - kernel_up)[1]) == static_cast<int>(ksize_left + ksize_right + 1));
1288 assert(static_cast<int>((kernel_bot - kernel_up)[0]) == static_cast<int>(ksize_up + ksize_bot + 1));
1289 std::size_t k_rows =
static_cast<std::size_t
>((kernel_bot - kernel_up)[0]);
1290 std::size_t k_cols =
static_cast<std::size_t
>((kernel_bot - kernel_up)[1]);
1291 std::size_t r_rows =
static_cast<std::size_t
>((R_bot - R_up)[0]);
1292 std::size_t r_cols =
static_cast<std::size_t
>((R_bot - R_up)[1]);
1295 typedef typename SrcIter2d::value_type value_type;
1296 typedef typename KernelIter2d::value_type k_value_type;
1300 std::reverse_iterator<KernelIter2d> k_rupper_left = std::reverse_iterator<KernelIter2d>(kernel_bot-dp);
1301 std::reverse_iterator<KernelIter2d> k_rbottom_right = std::reverse_iterator<KernelIter2d>(kernel_up);
1304 std::copy(k_rupper_left,k_rbottom_right,reverse_kernel.upper_left());
1308 for(std::size_t i = 0, ii = ksize_bot; i < r_rows; ++i, ++ii)
1310 for(std::size_t j = 0, jj = ksize_right; j < r_cols; ++j, ++jj)
1312 for(std::size_t k = 0, kk = (ii - ksize_bot); k < k_rows; ++k, ++kk)
1315 S_up.row_begin(kk)+j+k_cols,
1316 reverse_kernel.row_begin(k),value_type(0));
1368 template <
typename SrcIter2d,
1369 typename KernelIter2d,
1374 KernelIter2d kernel_up,
1375 KernelIter2d kernel_bot,
1385 assert((R_bot - R_up)[0] == ((S_bot - S_up)[0]));
1386 assert((R_bot - R_up)[1] == ((S_bot - S_up)[1]));
1387 assert(static_cast<int>((kernel_bot - kernel_up)[1]) == static_cast<int>(ksize_left + ksize_right + 1));
1388 assert(static_cast<int>((kernel_bot - kernel_up)[0]) == static_cast<int>(ksize_up + ksize_bot + 1));
1389 int s_rows =
static_cast<int>((S_bot - S_up)[0]);
1390 int s_cols =
static_cast<int>((S_bot - S_up)[1]);
1391 int k_rows =
static_cast<int>((kernel_bot - kernel_up)[0]);
1392 int k_cols =
static_cast<int>((kernel_bot - kernel_up)[1]);
1393 int r_rows =
static_cast<int>((R_bot - R_up)[0]);
1394 int r_cols =
static_cast<int>((R_bot - R_up)[1]);
1397 typedef typename SrcIter2d::value_type value_type;
1398 typedef typename KernelIter2d::value_type k_value_type;
1402 std::reverse_iterator<KernelIter2d> k_rupper_left = std::reverse_iterator<KernelIter2d>(kernel_bot-dp);
1403 std::reverse_iterator<KernelIter2d> k_rbottom_right = std::reverse_iterator<KernelIter2d>(kernel_up);
1406 std::copy(k_rupper_left,k_rbottom_right,reverse_kernel.upper_left());
1410 for(
int ii = ksize_bot; ii < (r_rows - ksize_up); ++ii)
1412 for(
int j = 0, jj = ksize_right; jj < (r_cols - ksize_left); ++j, ++jj)
1414 value_type tmp = value_type();
1415 for(
int k = 0, kk = (ii - ksize_bot); k < k_rows; ++k, ++kk)
1418 S_up.row_begin(kk)+j+k_cols,
1419 reverse_kernel.row_begin(k),
1422 *(R_up.row_begin(ii)+jj) = tmp;
1434 for(
int ii = 0; ii < ksize_bot; ++ii)
1436 for(
int j = 0,jj = ksize_right; jj < (r_cols - ksize_left); ++j, ++jj)
1438 value_type tmp = value_type();
1439 for(
int k = 0; k < (ksize_bot-ii); ++k)
1442 S_up.row_begin(0)+j+k_cols,
1443 reverse_kernel.row_begin(k),
1447 for(
int k = (ksize_bot-ii), kk = 0; k < k_rows; ++k, ++kk)
1451 S_up.row_begin(kk)+j+k_cols,
1452 reverse_kernel.row_begin(k),
1456 *(R_up.row_begin(ii)+jj) = tmp;
1462 for(
int i = 0, ii = (r_rows - ksize_up); ii < r_rows; ++i, ++ii)
1464 for(
int j = 0, jj = ksize_right; jj < (r_cols - ksize_left); ++j, ++jj)
1466 value_type tmp = value_type();
1467 for(
int kk = (ii - ksize_bot), k = 0; kk < r_rows; ++k, ++kk)
1470 S_up.row_begin(kk)+j+k_cols,
1471 reverse_kernel.row_begin(k),
1474 for(
int k = k_rows-1; k > (k_rows - 2 - i); --k)
1478 S_up.row_begin(r_rows-1)+j+k_cols,
1479 reverse_kernel.row_begin(k),
1483 *(R_up.row_begin(ii)+jj) = tmp;
1488 for(
int ii = ksize_bot; ii < (r_rows - ksize_up); ++ii)
1490 for(
int j = (r_cols - ksize_left - ksize_right), jj = (r_cols - ksize_left),cpt=0; jj < r_cols; ++j, ++jj,++cpt)
1492 value_type tmp = value_type();
1493 for(
int k = 0, kk = (ii - ksize_bot); k < k_rows; ++k, ++kk)
1497 reverse_kernel.row_begin(k),
1501 for(
int c = (k_cols - 1); c >= (k_cols - 1-cpt); --c)
1504 reverse_kernel.col_end(c),
1505 S_up.col_begin(s_cols-1)+(ii-ksize_bot),
1508 *(R_up.row_begin(ii)+jj) = tmp;
1512 for(
int ii = ksize_bot; ii < (r_rows - ksize_up); ++ii)
1514 for(
int j = ksize_right, jj = 0; jj < ksize_right; --j, ++jj)
1516 value_type tmp = value_type();
1517 for(
int k = 0, kk = (ii - ksize_bot); k < k_rows; ++k, ++kk)
1520 reverse_kernel.row_end(k),
1524 for(
int c = (j-1); c >= 0; --c)
1527 reverse_kernel.col_end(c),
1528 S_up.col_begin(0)+(ii-ksize_bot),
1531 *(R_up.row_begin(ii)+jj) = tmp;
1537 int stmp_rows =
static_cast<int>(Stmp.
rows());
1538 int stmp_cols =
static_cast<int>(Stmp.
cols());
1539 for(
int i = ksize_bot, ii = 0 ; i < stmp_rows; ++i, ++ii)
1542 S_up.row_begin(ii) + (k_cols - 1),
1545 for(
int i = 0; i < ksize_bot; ++i)
1548 S_up.row_begin(0) + (k_cols - 1),
1551 for(
int j = 0; j < ksize_right; ++j)
1558 for(
int ii = 0; ii < ksize_bot; ++ii)
1560 for(
int j = 0,jj = 0; jj < ksize_right; ++jj, ++j)
1562 value_type tmp = value_type();
1563 for(
int k = 0, kk = ii; k < k_rows; ++k, ++kk)
1566 reverse_kernel.row_end(k),
1571 *(R_up.row_begin(ii)+jj) = tmp;
1577 Stmp.
resize(ksize_up+k_rows-1,ksize_left+k_cols-1);
1578 stmp_rows =
static_cast<int>(Stmp.
rows());
1579 stmp_cols =
static_cast<int>(Stmp.
cols());
1580 int offsetj = (s_cols - k_cols + 1);
1582 for(
int i = 0, ii = ((r_rows - 1) - (ksize_bot + ksize_up - 1)) ; i < (ksize_up + 1); ++i, ++ii)
1588 for(
int i = (ksize_up + 1); i < stmp_rows; ++i)
1590 std::copy(S_up.row_begin(s_rows - 1) + offsetj,
1591 S_up.row_end(s_rows - 1),
1595 for(
int j = stmp_cols-ksize_left; j < stmp_cols ; ++j)
1598 Stmp.
col_end(stmp_cols-1-ksize_left),
1603 for(
int ii = (r_rows - ksize_up), i = 0; ii < r_rows; ++ii,++i)
1605 for(
int j = 0, jj = (r_cols - ksize_left); jj < r_cols; ++j, ++jj)
1607 value_type tmp = value_type();
1608 for(
int kk = i, k = 0; k < k_rows; ++k, ++kk)
1611 reverse_kernel.row_end(k),
1615 *(R_up.row_begin(ii)+jj) = tmp;
1621 Stmp.
resize(k_rows + ksize_bot - 1,k_cols + ksize_left - 1);
1622 stmp_rows =
static_cast<int>(Stmp.
rows());
1623 stmp_cols =
static_cast<int>(Stmp.
cols());
1624 for(
int i = ksize_bot, ii = 0 ; i < stmp_rows; ++i, ++ii)
1631 for(
int i = 0; i < ksize_bot; ++i)
1637 for(
int j = (k_cols - 1); j < stmp_cols; ++j)
1646 for(
int ii = 0; ii < ksize_bot; ++ii)
1648 for(
int j = 0, jj = (r_cols - ksize_left); jj < r_cols;++j,++jj)
1650 value_type tmp = value_type();
1651 for(
int k = 0, kk = ii; k < k_rows; ++k, ++kk)
1654 reverse_kernel.row_end(k),
1659 *(R_up.row_begin(ii)+jj) = tmp;
1665 Stmp.
resize(k_rows + ksize_up - 1,k_cols + ksize_right - 1);
1666 stmp_rows =
static_cast<int>(Stmp.
rows());
1667 stmp_cols =
static_cast<int>(Stmp.
cols());
1668 offsetj = (s_cols - 1 - ksize_left);
1669 for(
int i = 0, ii = ((r_rows - 1) - (ksize_bot + ksize_up - 1)) ; i < (ksize_up + 1); ++i, ++ii)
1672 S_up.row_begin(ii) + (k_cols - 1),
1675 for(
int i = (ksize_up + 1); i < stmp_rows; ++i)
1678 S_up.row_begin(r_rows - 1)+ (k_cols - 1),
1681 for(
int j = 0; j < ksize_right; ++j)
1688 for(
int ii = (r_rows - ksize_up), i = 0; ii < r_rows; ++ii, ++i)
1690 for(
int j = 0, jj = 0; jj < ksize_right; ++j, ++jj)
1692 value_type tmp = value_type();
1693 for(
int kk = i, k = 0; k < k_rows; ++k, ++kk)
1696 reverse_kernel.row_end(k),
1702 *(R_up.row_begin(ii)+jj) = tmp;
1710 for(
int ii = 0; ii < ksize_bot; ++ii)
1712 for(
int j = 0, jj = ksize_right; jj < (r_cols - ksize_left); ++j, ++jj)
1714 value_type tmp = value_type();
1715 for(
int k = (ksize_bot - ii), kk = 0; k < k_rows; ++k, ++kk)
1718 S_up.row_begin(kk)+j+k_cols,
1719 reverse_kernel.row_begin(k),
1723 *(R_up.row_begin(ii)+jj) = tmp;
1728 for(
int ii = (r_rows - ksize_up); ii < r_rows; ++ii)
1730 for(
int j = 0, jj = ksize_right; jj < (r_cols - ksize_left); ++j, ++jj)
1733 value_type tmp = value_type();
1734 for(
int kk = (ii - ksize_bot), k = 0; kk < r_rows; ++k, ++kk)
1737 S_up.row_begin(kk)+j+k_cols,
1738 reverse_kernel.row_begin(k),
1742 *(R_up.row_begin(ii)+jj) = tmp;
1748 for(
int ii = ksize_bot; ii < (r_rows - ksize_up); ++ii)
1750 for(
int j = (r_cols - ksize_left - ksize_right), jj = (r_cols - ksize_left); jj < r_cols; ++j, ++jj)
1752 value_type tmp = value_type();
1753 for(
int k = 0, kk = (ii - ksize_bot); k < k_rows; ++k, ++kk)
1757 reverse_kernel.row_begin(k),
1761 *(R_up.row_begin(ii)+jj) = tmp;
1766 for(
int ii = ksize_bot; ii < (r_rows - ksize_up); ++ii)
1768 for(
int j = ksize_right, jj = 0; jj < ksize_right; --j, ++jj)
1770 value_type tmp = value_type();
1771 for(
int k = 0, kk = (ii - ksize_bot); k < k_rows; ++k, ++kk)
1774 reverse_kernel.row_end(k),
1778 *(R_up.row_begin(ii)+jj) = tmp;
1782 for(
int ii = 0; ii < ksize_bot; ++ii)
1784 for(
int j = ksize_right, jj = 0; jj < ksize_right; --j, ++jj)
1786 value_type tmp = value_type();
1787 for(
int k = (ksize_bot - ii), kk = 0; k < k_rows; ++k, ++kk)
1790 reverse_kernel.row_end(k),
1794 *(R_up.row_begin(ii)+jj) = tmp;
1799 for(
int ii = 0; ii < ksize_bot; ++ii)
1801 for(
int j = (r_cols - ksize_left - ksize_right), jj = (r_cols - ksize_left); jj < r_cols; ++j, ++jj)
1804 value_type tmp = value_type();
1805 for(
int k = (ksize_bot - ii), kk = 0; k < k_rows; ++k, ++kk)
1809 reverse_kernel.row_begin(k),
1812 *(R_up.row_begin(ii)+jj) = tmp;
1817 for(
int ii = (r_rows - ksize_up); ii < r_rows; ++ii)
1819 for(
int j = (r_cols - ksize_left - ksize_right), jj = (r_cols - ksize_left); jj < r_cols; ++j, ++jj)
1822 value_type tmp = value_type();
1823 for(
int kk = (ii - ksize_bot), k = 0; kk < r_rows; ++k, ++kk)
1827 reverse_kernel.row_begin(k),
1830 *(R_up.row_begin(ii)+jj) = tmp;
1834 for(
int ii = (r_rows - ksize_up); ii < r_rows; ++ii)
1836 for(
int j = ksize_right, jj = 0; jj < ksize_right; --j, ++jj)
1838 value_type tmp = value_type();
1839 for(
int kk = (ii - ksize_bot), k = 0; kk < r_rows; ++k, ++kk)
1842 reverse_kernel.row_end(k),
1846 *(R_up.row_begin(ii)+jj) = tmp;
1854 for(
unsigned int ii = 0; ii < static_cast<unsigned int>(ksize_bot); ++ii)
1856 for(
unsigned int j = 0,jj = static_cast<unsigned int>(ksize_right); jj < static_cast<unsigned int>(r_cols - ksize_left); ++j, ++jj)
1858 value_type tmp = value_type();
1859 unsigned int jjj = j%s_cols;
1860 for(
unsigned int k = 0, kk = (ii - static_cast<unsigned int>(ksize_bot)); k < static_cast<unsigned int>(k_rows); ++k, ++kk)
1862 unsigned int kkk = kk%s_rows;
1864 S_up.row_begin(kkk)+jjj+k_cols,
1865 reverse_kernel.row_begin(k),
1868 *(R_up.row_begin(ii)+jj) = tmp;
1872 for(
unsigned int ii = static_cast<unsigned int>(r_rows - ksize_up); ii < static_cast<unsigned int>(r_rows); ++ii)
1874 for(
unsigned int j = 0, jj = static_cast<unsigned int>(ksize_right); jj < static_cast<unsigned int>(r_cols - ksize_left); ++j, ++jj)
1876 value_type tmp = value_type();
1877 unsigned int jjj = j%s_cols;
1878 for(
unsigned int k = 0, kk = (ii - static_cast<unsigned int>(ksize_bot)); k < static_cast<unsigned int>(k_rows); ++k, ++kk)
1880 unsigned int kkk = kk%s_rows;
1882 S_up.row_begin(kkk)+jjj+k_cols,
1883 reverse_kernel.row_begin(k),
1886 *(R_up.row_begin(ii)+jj) = tmp;
1890 for(
unsigned int ii = static_cast<unsigned int>(ksize_bot); ii < static_cast<unsigned int>(r_rows - ksize_up); ++ii)
1892 for(
unsigned int j = static_cast<unsigned int>(r_cols - ksize_left - ksize_right), jj =
static_cast<unsigned int>(r_cols - ksize_left); jj < static_cast<unsigned int>(r_cols); ++j, ++jj)
1894 value_type tmp = value_type();
1896 for(
unsigned int k = 0, kk = (ii - static_cast<unsigned int>(ksize_bot)); k < static_cast<unsigned int>(k_rows); ++k, ++kk)
1898 d[0] =
static_cast<int>(kk);
1899 for(
unsigned int l = 0, ll = (jj-static_cast<unsigned int>(ksize_right)); l < static_cast<unsigned int>(k_cols); ++l,++ll)
1901 d[1] =
static_cast<int>(ll%s_cols);
1902 tmp += S_up[d] * reverse_kernel[k][l];
1905 *(R_up.row_begin(ii)+jj) = tmp;
1909 for(
unsigned int ii = static_cast<unsigned int>(ksize_bot); ii < static_cast<unsigned int>(r_rows - ksize_up); ++ii)
1911 for(
unsigned int j = static_cast<unsigned int>(ksize_right), jj = 0; jj < static_cast<unsigned int>(ksize_right); --j, ++jj)
1913 value_type tmp = value_type();
1915 for(
unsigned int k = 0, kk = (ii - static_cast<unsigned int>(ksize_bot)); k < static_cast<unsigned int>(k_rows); ++k, ++kk)
1917 d[0] =
static_cast<int>(kk);
1918 for(
unsigned int l = 0, ll = (s_cols - ksize_right+jj); l < static_cast<unsigned int>(k_cols); ++l,++ll)
1920 d[1] =
static_cast<int>(ll%s_cols);
1921 tmp += S_up[d] * reverse_kernel[k][l];
1924 *(R_up.row_begin(ii)+jj) = tmp;
1928 for(
int ii = 0; ii < ksize_bot; ++ii)
1930 for(
int j = ksize_right, jj = 0; jj < ksize_right; --j, ++jj)
1932 value_type tmp = value_type();
1934 for(
unsigned int k = 0, kk = static_cast<unsigned int>(s_rows-ksize_bot+ii); k < static_cast<unsigned int>(k_rows); ++k, ++kk)
1936 d[0] =
static_cast<int>(kk%s_rows);
1937 for(
unsigned int l = 0, ll = static_cast<unsigned int>(s_cols - ksize_right+jj); l < static_cast<unsigned int>(k_cols); ++l,++ll)
1939 d[1] =
static_cast<int>(ll%s_cols);
1940 tmp += S_up[d] * reverse_kernel[k][l];
1943 *(R_up.row_begin(ii)+jj) = tmp;
1948 for(
int ii = 0; ii < ksize_bot; ++ii)
1950 for(
int j = (r_cols - ksize_left - ksize_right), jj = (r_cols - ksize_left); jj < r_cols; ++j, ++jj)
1952 value_type tmp = value_type();
1954 for(
int k = 0, kk = (s_rows-ksize_bot+ii); k < k_rows; ++k, ++kk)
1956 d[0] =
static_cast<int>(kk%s_rows);
1957 for(
unsigned int l = 0, ll = static_cast<unsigned int>(jj-ksize_right); l < static_cast<unsigned int>(k_cols); ++l,++ll)
1959 d[1] =
static_cast<int>(ll%s_cols);
1960 tmp += S_up[d] * reverse_kernel[k][l];
1964 *(R_up.row_begin(ii)+jj) = tmp;
1968 for(
int ii = (r_rows - ksize_up); ii < r_rows; ++ii)
1970 for(
int j = (r_cols - ksize_left - ksize_right), jj = (r_cols - ksize_left); jj < r_cols; ++j, ++jj)
1973 value_type tmp = value_type();
1975 for(
unsigned int kk = static_cast<unsigned int>(s_rows-ksize_bot+ii), k = 0; k < static_cast<unsigned int>(k_rows); ++k, ++kk)
1977 d[0] =
static_cast<int>(kk%s_rows);
1978 for(
unsigned int l = 0, ll = static_cast<unsigned int>(jj-ksize_right); l < static_cast<unsigned int>(k_cols); ++l,++ll)
1980 d[1] =
static_cast<int>(ll%s_cols);
1981 tmp += S_up[d] * reverse_kernel[k][l];
1985 *(R_up.row_begin(ii)+jj) = tmp;
1989 for(
int ii = (r_rows - ksize_up); ii < r_rows; ++ii)
1991 for(
int j = ksize_right, jj = 0; jj < ksize_right; --j, ++jj)
1993 value_type tmp = value_type();
1995 for(
unsigned int kk = static_cast<unsigned int>(s_rows-ksize_bot+ii), k = 0; k < static_cast<unsigned int>(k_rows); ++k, ++kk)
1997 d[0] =
static_cast<int>(kk%s_rows);
1998 for(
unsigned int l = 0, ll = static_cast<unsigned int>(s_cols - ksize_right+jj); l < static_cast<unsigned int>(k_cols); ++l,++ll)
2000 d[1] =
static_cast<int>(ll%s_cols);
2001 tmp += S_up[d] * reverse_kernel[k][l];
2005 *(R_up.row_begin(ii)+jj) = tmp;
2010 default: std::cout<<
"default"<<std::endl;
2052 template <
typename SrcIter2d,
2053 typename KernelIter2d,
2058 KernelIter2d kernel_up,
2059 KernelIter2d kernel_bot,
2064 int k_rows =
static_cast<int>((kernel_bot - kernel_up)[0] - 1);
2065 int k_cols =
static_cast<int>((kernel_bot - kernel_up)[1] - 1);
2066 int k_rows_2 = k_rows / 2;
2067 int k_cols_2 = k_cols / 2;
2069 kernel_up,kernel_bot,
2070 k_cols - k_cols_2,k_cols_2,
2071 k_rows - k_rows_2,k_rows_2,
2116 template <
typename Container2d1,
2118 typename Container2d2>
2121 const Kernel2d& Kernel,
2122 Container2d2& Result,
2126 Kernel.upper_left(),Kernel.bottom_right(),
2127 Result.upper_left(),Result.bottom_right(),
2161 template <
typename SrcIter2d,
2162 typename KernelIter2d,
2167 KernelIter2d kernel_up,
2168 KernelIter2d kernel_bot,
2172 assert( (R_bot - R_up)[0] == ((S_bot - S_up)[0] + (kernel_bot - kernel_up)[0] - 1));
2173 assert( (R_bot - R_up)[1] == ((S_bot - S_up)[1] + (kernel_bot - kernel_up)[1] - 1));
2175 int s_rows =
static_cast<int>((S_bot - S_up)[0]);
2176 int s_cols =
static_cast<int>((S_bot - S_up)[1]);
2177 int k_rows =
static_cast<int>((kernel_bot - kernel_up)[0]);
2178 int k_cols =
static_cast<int>((kernel_bot - kernel_up)[1]);
2180 typedef typename SrcIter2d::value_type value_type;
2184 std::reverse_iterator<KernelIter2d> k_rupper_left = std::reverse_iterator<KernelIter2d>(kernel_bot-dp);
2185 std::reverse_iterator<KernelIter2d> k_rbottom_right = std::reverse_iterator<KernelIter2d>(kernel_up);
2188 reverse_kernel(k_rows,k_cols);
2189 std::copy(k_rupper_left,k_rbottom_right,reverse_kernel.upper_left());
2194 int imax = (k_rows - 1);
2195 int jmax = (s_cols - k_cols + 1);
2196 for(
int i = 0, ii = 0; i < imax; ++i,++ii)
2199 for(
int j = 0, jj =(k_cols-1); j < jmax; ++j, ++jj)
2202 value_type tmp = value_type();
2203 for(
int k = (k_rows-1-i),kk = 0; k < k_rows; ++k,++kk)
2206 reverse_kernel.row_end(k),
2207 S_up.row_begin(kk)+j,
2217 imax = (s_rows - k_rows+1);
2218 jmax = (s_cols - k_cols + 1);
2219 for(
int i = 0, ii = (k_rows -1); i < imax; ++i,++ii)
2222 for(
int j = 0, jj =(k_cols-1); j < jmax; ++j, ++jj)
2225 value_type tmp = value_type();
2226 for(
int k = 0; k < k_rows; ++k)
2229 reverse_kernel.row_end(k),
2230 S_up.row_begin(i+k)+j,
2239 jmax = (s_cols - k_cols + 1);
2240 for(
int i = (s_rows - k_rows+1), ii = s_rows; i < s_rows; ++i,++ii)
2243 for(
int j = 0, jj =(k_cols-1); j < jmax; ++j, ++jj)
2246 value_type tmp = value_type();
2247 for(
int k = 0, kk = i; k < (s_rows-i); ++k,++kk)
2250 reverse_kernel.row_end(k),
2251 S_up.row_begin(kk)+j,
2260 imax = (s_rows - k_rows + 1);
2262 for(
int i = 0, ii = (k_rows -1); i < imax; ++i,++ii)
2265 for(
int j = 0, jj =0; j < jmax; ++j, ++jj)
2268 value_type tmp = value_type();
2269 for(
int k = 0; k < k_rows; ++k)
2273 reverse_kernel.row_end(k),
2274 S_up.row_begin(i+k),
2283 imax = (s_rows - k_rows + 1);
2284 int jtmp = s_cols - k_cols;
2285 for(
int i = 0, ii = (k_rows -1); i < imax; ++i,++ii)
2288 for(
int j = (s_cols - k_cols + 1), jj =s_cols; j < s_cols;++j, ++jj)
2291 value_type tmp = value_type();
2292 for(
int k = 0; k < k_rows; ++k)
2295 reverse_kernel.row_end(k) - (j - jtmp),
2296 S_up.row_begin(i+k)+j,
2307 for(
int i = 0, ii = 0; i < imax; ++i,++ii)
2310 for(
int j = 0, jj = 0; j < jmax; ++j, ++jj)
2313 value_type tmp = value_type();
2314 for(
int k = (k_rows-1-i),kk = 0; k < k_rows; ++k,++kk)
2318 reverse_kernel.row_end(k),
2330 for(
int i = 0, ii = 0; i < imax; ++i,++ii)
2333 for(
int j = (s_cols - k_cols + 1), jj = s_cols; j < s_cols; ++j, ++jj)
2336 value_type tmp = value_type();
2337 for(
int k = (k_rows-1-i),kk = 0; k < k_rows; ++k,++kk)
2340 reverse_kernel.row_end(k)
2342 S_up.row_begin(kk)+j,
2351 imax = (s_rows - k_rows + 1);
2352 jmax = (s_cols - k_cols + 1);
2353 for(
int i = (s_rows - k_rows + 1), ii = s_rows; i < s_rows; ++i,++ii)
2356 for(
int j = (s_cols - k_cols + 1), jj = s_cols; j < s_cols; ++j, ++jj)
2359 value_type tmp = value_type();
2360 for(
int k = 0, kk = i; k < (s_rows-i); ++k,++kk)
2363 reverse_kernel.row_end(k)- (j - jtmp),
2364 S_up.row_begin(kk)+j,
2373 imax = (s_rows - k_rows+1);
2375 for(
int i = (s_rows - k_rows + 1), ii = s_rows; i < s_rows; ++i,++ii)
2378 for(
int j = 0, jj =0; j < jmax; ++j, ++jj)
2381 value_type tmp = value_type();
2382 for(
int k = 0, kk = i; k < (s_rows-i); ++k,++kk)
2386 reverse_kernel.row_end(k),
2430 template<
typename InputIterator2d1,
typename InputIterator2d2,
typename OutputIterator2d>
2433 InputIterator2d1 in1_bottom_right,
2434 InputIterator2d2 in2_upper_left,
2435 InputIterator2d2 in2_bottom_right,
2436 OutputIterator2d out_upper_left,
2437 OutputIterator2d out_bottom_right)
2439 assert(((in1_bottom_right - in1_upper_left)[0]+(in2_bottom_right - in2_upper_left)[0] - 1) == (out_bottom_right - out_upper_left)[0]);
2440 assert(((in1_bottom_right - in1_upper_left)[1]+(in2_bottom_right - in2_upper_left)[1] - 1) == (out_bottom_right - out_upper_left)[1]);
2442 typename InputIterator2d1::difference_type size2din1 = in1_bottom_right - in1_upper_left;
2443 typename InputIterator2d2::difference_type size2din2 = in2_bottom_right - in2_upper_left;
2444 typename OutputIterator2d::difference_type size2dout = out_bottom_right - out_upper_left;
2446 typedef typename std::iterator_traits<InputIterator2d1>::value_type value_type;
2449 std::size_t rows = size2din1[0] + size2din2[0] - 1;
2450 std::size_t cols = size2din1[1] + size2din2[1] - 1;
2455 static_cast<int>(size2din1[0]-1),
2456 static_cast<int>(size2din1[1]-1));
2458 static_cast<int>(size2din2[0]-1),
2459 static_cast<int>(size2din2[1]-1));
2462 std::copy(in2_upper_left,in2_bottom_right,
2512 template <
typename Container2d1,
2514 typename Container2d2>
2516 const Kernel2d& Kernel,
2517 Container2d2& Result)
2522 Kernel.upper_left(),Kernel.bottom_right(),
2523 Result.upper_left(),Result.bottom_right());
2590 template <
typename RandomAccessIterator3d1,
2591 typename KernelIter1,
2592 typename KernelIter2,
2593 typename KernelIter3,
2594 typename RandomAccessIterator3d2>
2597 RandomAccessIterator3d1 I_bot,
2598 KernelIter1 k1_first,
2599 KernelIter1 k1_last,
2600 std::size_t ksize_left1,
2601 std::size_t ksize_right1,
2603 KernelIter2 k2_first,
2604 KernelIter2 k2_last,
2605 std::size_t ksize_left2,
2606 std::size_t ksize_right2,
2608 KernelIter3 k3_first,
2609 KernelIter3 k3_last,
2610 std::size_t ksize_left3,
2611 std::size_t ksize_right3,
2613 RandomAccessIterator3d2 R_up)
2616 typename RandomAccessIterator3d1::difference_type size3d =I_bot - I_up;
2617 typedef typename RandomAccessIterator3d1::size_type size_type;
2618 typedef typename RandomAccessIterator3d1::value_type value_type;
2620 size_type nb_slice = size3d[0];
2621 size_type nb_rows = size3d[1];
2622 size_type nb_cols = size3d[2];
2626 for(size_type k = 0; k < nb_slice; ++k)
2628 for(size_type i = 0; i < nb_rows; ++i)
2639 R_up.row_begin(k,i));
2643 for(size_type k = 0; k < nb_slice; ++k)
2645 for(size_type j = 0; j < nb_cols; ++j)
2656 R_up.col_begin(k,j));
2661 for(size_type i = 0; i < nb_rows; ++i)
2663 for(size_type j = 0; j < nb_cols; ++j)
2666 R_up.slice_end(i,j),
2674 R_up.slice_begin(i,j));
2722 template <
typename RandomAccessIterator3d1,
2723 typename KernelIter1,
2724 typename KernelIter2,
2725 typename KernelIter3,
2726 typename RandomAccessIterator3d2>
2729 RandomAccessIterator3d1 I_bot,
2730 KernelIter1 k1_first,
2731 KernelIter1 k1_last,
2732 KernelIter2 k2_first,
2733 KernelIter2 k2_last,
2734 KernelIter3 k3_first,
2735 KernelIter3 k3_last,
2736 RandomAccessIterator3d2 R_up,
2740 std::size_t size1 = (k1_last-k1_first)/2;
2741 std::size_t size1_bis = (k1_last-k1_first) - 1 - size1;
2742 std::size_t size2 = (k2_last-k2_first)/2;
2743 std::size_t size2_bis = (k2_last-k2_first) - 1 - size2;
2744 std::size_t size3 = (k3_last-k3_first)/2;
2745 std::size_t size3_bis = (k3_last-k3_first) - 1 - size3;
2803 template <
typename Container1,
2807 typename Container2>
2809 const Kernel1& kernel1,
2810 const Kernel2& kernel2,
2811 const Kernel3& kernel3,
2818 Signal.back_bottom_right(),
2819 kernel1.begin(),kernel1.end(),
2820 kernel2.begin(),kernel2.end(),
2821 kernel3.begin(),kernel3.end(),
2822 Result.front_upper_left(),
2882 template <
typename RandomAccessIterator3d1,
2883 typename KernelIter1,
2884 typename KernelIter2,
2885 typename KernelIter3>
2888 RandomAccessIterator3d1 I_bot,
2889 KernelIter1 k1_first,
2890 KernelIter1 k1_last,
2891 std::size_t ksize_left1,
2892 std::size_t ksize_right1,
2894 KernelIter2 k2_first,
2895 KernelIter2 k2_last,
2896 std::size_t ksize_left2,
2897 std::size_t ksize_right2,
2899 KernelIter3 k3_first,
2900 KernelIter3 k3_last,
2901 std::size_t ksize_left3,
2902 std::size_t ksize_right3,
2906 typename RandomAccessIterator3d1::difference_type size3d =I_bot - I_up;
2907 typedef typename RandomAccessIterator3d1::size_type size_type;
2908 typedef typename RandomAccessIterator3d1::value_type value_type;
2910 const size_type nb_slice = size3d[0];
2911 const size_type nb_rows = size3d[1];
2912 const size_type nb_cols = size3d[2];
2916 for(size_type k = 0; k < nb_slice; ++k)
2918 for(size_type i = 0; i < nb_rows; ++i)
2929 I_up.row_begin(k,i));
2933 for(size_type k = 0; k < nb_slice; ++k)
2935 for(size_type j = 0; j < nb_cols; ++j)
2946 I_up.col_begin(k,j));
2951 for(size_type i = 0; i < nb_rows; ++i)
2953 for(size_type j = 0; j < nb_cols; ++j)
2956 I_up.slice_end(i,j),
2964 I_up.slice_begin(i,j));
3007 template <
typename RandomAccessIterator3d1,
3008 typename KernelIter1,
3009 typename KernelIter2,
3010 typename KernelIter3,
3011 typename RandomAccessIterator3d2>
3014 RandomAccessIterator3d1 I_bot,
3015 KernelIter1 k1_first,
3016 KernelIter1 k1_last,
3017 KernelIter2 k2_first,
3018 KernelIter2 k2_last,
3019 KernelIter3 k3_first,
3020 KernelIter3 k3_last,
3021 RandomAccessIterator3d2 R_up)
3023 typename RandomAccessIterator3d1::difference_type size3d =
3025 typedef typename RandomAccessIterator3d1::size_type size_type;
3026 typedef typename RandomAccessIterator3d1::value_type value_type;
3027 size_type nb_slices = size3d[0];
3028 size_type nb_rows = size3d[1];
3029 size_type nb_cols = size3d[2];
3031 size_type size1 = (k1_last - k1_first);
3032 size_type size2 = (k2_last - k2_first);
3033 size_type size3 = (k3_last - k3_first);
3035 size_type size2o2 = size2/2;
3036 size_type size1o2 = size1/2;
3039 nb_rows + size1 - 1,
3040 nb_cols + size2 - 1);
3042 nb_rows + size1 - 1,
3043 nb_cols + size2 - 1);
3047 for(
size_t k = 0; k < nb_slices; ++k)
3049 for(
size_t i = 0; i < nb_rows; ++i)
3058 for(
size_t k = 0; k < nb_slices; ++k)
3060 for(
size_t j = 0; j < nb_cols; ++j)
3070 for(
size_t i = 0; i < nb_rows; ++i)
3072 for(
size_t j = 0; j < nb_cols; ++j)
3077 Vtmp.begin(),Vtmp.end());
3078 std::copy(Vtmp.begin()+size2o2,Vtmp.end()-size2o2,R_up.col_begin(i,j));
3115 template <
typename Container1,
3119 typename Container2>
3121 const Kernel1& kernel1,
3122 const Kernel2& kernel2,
3123 const Kernel3& kernel3,
3129 Signal.back_bottom_right(),
3130 kernel1.begin(),kernel1.end(),
3131 kernel2.begin(),kernel2.end(),
3132 kernel3.begin(),kernel3.end(),
3133 Result.front_upper_left());
3171 template<
typename InputIterator3d1,
3172 typename InputIterator3d2,
3173 typename OutputIterator3d>
3177 InputIterator3d1 in1_back_bottom_right,
3178 InputIterator3d2 in2_front_upper_left,
3179 InputIterator3d2 in2_back_bottom_right,
3180 OutputIterator3d out_front_upper_left,
3181 OutputIterator3d out_back_bottom_right)
3183 assert(((in1_back_bottom_right - in1_front_upper_left)[0]+(in2_back_bottom_right - in2_front_upper_left)[0] - 1) == (out_back_bottom_right - out_front_upper_left)[0]);
3184 assert(((in1_back_bottom_right - in1_front_upper_left)[1]+(in2_back_bottom_right - in2_front_upper_left)[1] - 1) == (out_back_bottom_right - out_front_upper_left)[1]);
3185 assert(((in1_back_bottom_right - in1_front_upper_left)[2]+(in2_back_bottom_right - in2_front_upper_left)[2] - 1) == (out_back_bottom_right - out_front_upper_left)[2]);
3187 typename InputIterator3d1::difference_type size3din1 = in1_back_bottom_right - in1_front_upper_left;
3188 typename InputIterator3d2::difference_type size3din2 = in2_back_bottom_right - in2_front_upper_left;
3189 typename OutputIterator3d::difference_type size3dout = out_back_bottom_right - out_front_upper_left;
3193 std::size_t slices = size3din1[0] + size3din2[0] - 1;
3194 std::size_t rows = size3din1[1] + size3din2[1] - 1;
3195 std::size_t cols = size3din1[2] + size3din2[2] - 1;
3201 static_cast<int>(size3din1[0]-1),
3202 static_cast<int>(size3din1[1]-1),
3203 static_cast<int>(size3din1[2]-1));
3205 static_cast<int>(size3din2[0]-1),
3206 static_cast<int>(size3din2[1]-1),
3207 static_cast<int>(size3din2[2]-1));
3209 in1_back_bottom_right,
3211 std::copy(in2_front_upper_left,in2_back_bottom_right,
3220 fft1.front_upper_left());
3228 slip::ifft3d(fft1.front_upper_left(), fft1.back_bottom_right(),
3232 out_front_upper_left,
3264 template <
typename Container3d1,
3266 typename Container3d2>
3268 const Kernel3d& Kernel,
3269 Container3d2& Result)
3274 Signal.back_bottom_right(),
3275 Kernel.front_upper_left(),
3276 Kernel.back_bottom_right(),
3277 Result.front_upper_left(),
3278 Result.back_bottom_right());
3302 template<
typename InputIterator3d1,
3303 typename InputIterator3d2,
3304 typename OutputIterator3d>
3308 InputIterator3d1 in1_back_bottom_right,
3309 InputIterator3d2 in2_front_upper_left,
3310 InputIterator3d2 in2_back_bottom_right,
3311 OutputIterator3d out_front_upper_left,
3312 OutputIterator3d out_back_bottom_right)
3314 assert( (in1_back_bottom_right - in1_front_upper_left)
3315 == (out_back_bottom_right - out_front_upper_left));
3317 typename InputIterator3d1::difference_type size3din1 = in1_back_bottom_right - in1_front_upper_left;
3318 typename InputIterator3d2::difference_type size3din2 = in2_back_bottom_right - in2_front_upper_left;
3319 typename OutputIterator3d::difference_type size3dout = out_back_bottom_right - out_front_upper_left;
3323 std::size_t slices = size3din1[0] + size3din2[0] - 1;
3324 std::size_t rows = size3din1[1] + size3din2[1] - 1;
3325 std::size_t cols = size3din1[2] + size3din2[2] - 1;
3331 static_cast<int>(size3din1[0]-1),
3332 static_cast<int>(size3din1[1]-1),
3333 static_cast<int>(size3din1[2]-1));
3335 static_cast<int>(size3din2[0]-1),
3336 static_cast<int>(size3din2[1]-1),
3337 static_cast<int>(size3din2[2]-1));
3339 in1_back_bottom_right,
3341 std::copy(in2_front_upper_left,in2_back_bottom_right,
3350 fft1.front_upper_left());
3358 slip::ifft3d(fft1.front_upper_left(), fft1.back_bottom_right(),
3364 static_cast<int>(size3din2[0]/2 + size3din1[0] - 1),
3365 static_cast<int>(size3din2[1]/2 + size3din1[1] - 1),
3366 static_cast<int>(size3din2[2]/2 + size3din1[2] - 1));
3430 template <
typename SrcIter3d,
3431 typename KernelIter3d,
3436 KernelIter3d kernel_up,
3437 KernelIter3d kernel_bot,
3438 std::size_t ksize_front,
3439 std::size_t ksize_back,
3440 std::size_t ksize_left,
3441 std::size_t ksize_right,
3442 std::size_t ksize_up,
3443 std::size_t ksize_bot,
3448 assert((R_bot - R_up)[0] == ((S_bot - S_up)[0] - (kernel_bot - kernel_up)[0] + 1));
3449 assert((R_bot - R_up)[1] == ((S_bot - S_up)[1] - (kernel_bot - kernel_up)[1] + 1));
3450 assert((R_bot - R_up)[2] == ((S_bot - S_up)[2] - (kernel_bot - kernel_up)[2] + 1));
3452 assert(static_cast<int>((kernel_bot - kernel_up)[0]) == static_cast<int>(ksize_front + ksize_back + 1));
3453 assert(static_cast<int>((kernel_bot - kernel_up)[1]) == static_cast<int>(ksize_up + ksize_bot + 1));
3454 assert(static_cast<int>((kernel_bot - kernel_up)[2]) == static_cast<int>(ksize_left + ksize_right + 1));
3457 std::size_t k_slices =
static_cast<std::size_t
>((kernel_bot - kernel_up)[0]);
3458 std::size_t k_rows =
static_cast<std::size_t
>((kernel_bot - kernel_up)[1]);
3459 std::size_t k_cols =
static_cast<std::size_t
>((kernel_bot - kernel_up)[2]);
3460 std::size_t r_slices =
static_cast<std::size_t
>((R_bot - R_up)[0]);
3461 std::size_t r_rows =
static_cast<std::size_t
>((R_bot - R_up)[1]);
3462 std::size_t r_cols =
static_cast<std::size_t
>((R_bot - R_up)[2]);
3465 typedef typename SrcIter3d::value_type value_type;
3466 typedef typename KernelIter3d::value_type k_value_type;
3470 std::reverse_iterator<KernelIter3d> k_rupper_left = std::reverse_iterator<KernelIter3d>(kernel_bot-dp);
3471 std::reverse_iterator<KernelIter3d> k_rbottom_right = std::reverse_iterator<KernelIter3d>(kernel_up);
3474 std::copy(k_rupper_left,k_rbottom_right,reverse_kernel.front_upper_left());
3478 for(std::size_t k = 0, kk = ksize_back; k < r_slices; ++k, ++kk)
3480 for(std::size_t i = 0, ii = ksize_bot; i < r_rows; ++i, ++ii)
3482 for(std::size_t j = 0, jj = ksize_right; j < r_cols; ++j, ++jj)
3484 for(std::size_t s = 0, ss = (kk - ksize_back); s < k_slices; ++s, ++ss)
3486 for(std::size_t l = 0, ll = (ii - ksize_bot); l < k_rows; ++l, ++ll)
3488 *(R_up.row_begin(k,i)+j)+=
3490 S_up.row_begin(ss,ll)+j+k_cols,
3491 reverse_kernel.row_begin(s,l),
3505 #endif //SLIP_CONVOLUTION_HPP
void valid_convolution3d(SrcIter3d S_up, SrcIter3d S_bot, KernelIter3d kernel_up, KernelIter3d kernel_bot, std::size_t ksize_front, std::size_t ksize_back, std::size_t ksize_left, std::size_t ksize_right, std::size_t ksize_up, std::size_t ksize_bot, ResIter3d R_up, ResIter3d R_bot)
Computes the valid convolution of 3d signal by a 3d-kernel.
iterator2d upper_left()
Returns a read/write iterator2d that points to the first element of the Array2d. It points to the upp...
iterator3d front_upper_left()
Returns a read/write iterator3d that points to the first element of the Array3d. It points to the fro...
void fft_circular_convolution(RandomAccessIterator1 first, RandomAccessIterator1 last, RandomAccessIterator2 first2, RandomAccessIterator2 last2, RandomAccessIterator3 conv_first, RandomAccessIterator3 conv_last)
Computes the FFT circular convolution.
void separable_convolution2d(RandomAccessIterator2d1 I_up, RandomAccessIterator2d1 I_bot, KernelIter1 k1_first, KernelIter1 k1_last, std::size_t ksize_left1, std::size_t ksize_right1, slip::BORDER_TREATMENT bt1, KernelIter2 k2_first, KernelIter2 k2_last, std::size_t ksize_left2, std::size_t ksize_right2, slip::BORDER_TREATMENT bt2, RandomAccessIterator2d2 R_up)
Computes the separable convolution of a 2d signal by two asymmetric 1d-kernels support.
Difference of Point3D class, specialization of DPoint<CoordType,DIM> with DIM = 3.
slice_iterator slice_end(const size_type row, const size_type col)
Returns a read/write iterator that points to the one past the end element of the line (row...
Provides a class to manipulate 2d box.
iterator end()
Returns a read/write iterator that points one past the last element in the Vector. Iteration is done in ordinary element order.
This is a three-dimensional dynamic and generic container. This container statisfies the Bidirectionn...
const_iterator begin() const
Returns a read-only (constant) iterator that points to the first element in the Array3d. Iteration is done in ordinary element order.
iterator begin()
Returns a read/write iterator that points to the first element in the Array. Iteration is done in ord...
Real functor. Return the real part of x.
size_type slices() const
Returns the number of slices (first dimension size) in the Array3d.
void fft_convolution3d(InputIterator3d1 in1_front_upper_left, InputIterator3d1 in1_back_bottom_right, InputIterator3d2 in2_front_upper_left, InputIterator3d2 in2_back_bottom_right, OutputIterator3d out_front_upper_left, OutputIterator3d out_back_bottom_right)
Computes the convolution of two 3D sequences using fft3d.
void fft_convolution3d_same(InputIterator3d1 in1_front_upper_left, InputIterator3d1 in1_back_bottom_right, InputIterator3d2 in2_front_upper_left, InputIterator3d2 in2_back_bottom_right, OutputIterator3d out_front_upper_left, OutputIterator3d out_back_bottom_right)
Computes the convolution between two 3D sequences using fft3d.
row_iterator row_begin(const size_type slice, const size_type row)
Returns a read/write iterator that points to the first element of the row row of the slice slice in t...
row_iterator row_end(const size_type slice, const size_type row)
Returns a read/write iterator that points to the past-the-end element of the row row of the slice sli...
void real_fft2d(InputBidirectionalIterator2d in_upper_left, InputBidirectionalIterator2d in_bottom_right, OutputBidirectionalIterator2d out_upper_left)
Computes the real fft2d of a container with 2d iterators.
void fft_convolution2d(InputIterator2d1 in1_upper_left, InputIterator2d1 in1_bottom_right, InputIterator2d2 in2_upper_left, InputIterator2d2 in2_bottom_right, OutputIterator2d out_upper_left, OutputIterator2d out_bottom_right)
Computes the standard crosscorrelation between two 2D sequences using fft2d.
Provides a class to manipulate 1d dynamic and generic arrays.
void ifft3d(InputBidirectionalIterator3d in_front_upper_left, InputBidirectionalIterator3d in_back_bottom_right, OutputBidirectionalIterator3d out_front_upper_left)
Computes the ifft3d of a container with 3d iterators.
void same_convolution2d(SrcIter2d S_up, SrcIter2d S_bot, KernelIter2d kernel_up, KernelIter2d kernel_bot, int ksize_left, int ksize_right, int ksize_up, int ksize_bot, ResIter2d R_up, ResIter2d R_bot, slip::BORDER_TREATMENT bt=slip::BORDER_TREATMENT_ZERO_PADDED)
Computes the same convolution of 2d signal by a 2d-kernel.
Provides some algorithms to handle the border conditions of ranges.
void ifft(InputIter in_begin, InputIter in_end, OutputIter out_begin)
Computes the inverse fft of a container.
void valid_convolution2d(SrcIter2d S_up, SrcIter2d S_bot, KernelIter2d kernel_up, KernelIter2d kernel_bot, std::size_t ksize_left, std::size_t ksize_right, std::size_t ksize_up, std::size_t ksize_bot, ResIter2d R_up, ResIter2d R_bot)
Computes the valid convolution of 2d signal by a 2d-kernel.
void resize(const size_type d1, const size_type d2, const T &val=T())
Resizes a Array2d.
void separable_fft_convolution3d(RandomAccessIterator3d1 I_up, RandomAccessIterator3d1 I_bot, KernelIter1 k1_first, KernelIter1 k1_last, KernelIter2 k2_first, KernelIter2 k2_last, KernelIter3 k3_first, KernelIter3 k3_last, RandomAccessIterator3d2 R_up)
Computes the separable 3d convolution of signal using the fft algorithm.
iterator end()
Returns a read/write iterator that points one past the last element in the Array. Iteration is done i...
void separable_fft_convolution2d(RandomAccessIterator2d1 I_up, RandomAccessIterator2d1 I_bot, KernelIter1 k1_first, KernelIter1 k1_last, KernelIter2 k2_first, KernelIter2 k2_last, RandomAccessIterator2d2 R_up)
Computes the separable 2d convolution of signal using the fft algorithm.
void multiplies(InputIterator1 __first1, InputIterator1 __last1, InputIterator2 __first2, OutputIterator __result)
Computes the pointwise product of two ranges.
void copy(_II first, _II last, _OI output_first)
Copy algorithm optimized for slip iterators.
Difference of Point2D class, specialization of DPoint<CoordType,DIM> with DIM = 2.
Numerical Vector class. This container statisfies the RandomAccessContainer concepts of the Standard ...
size_type rows() const
Returns the number of rows (first dimension size) in the Array2d.
col_iterator col_begin(const size_type col)
Returns a read/write iterator that points to the first element of the column column in the Array2d...
col_iterator col_end(const size_type slice, const size_type col)
Returns a read/write iterator that points to the past-the-end element of the column column of the sli...
iterator end()
Returns a read/write iterator that points one past the last element in the Array2d. Iteration is done in ordinary element order.
void fft_convolution(RandomAccessIterator1 first, RandomAccessIterator1 last, RandomAccessIterator2 first2, RandomAccessIterator2 last2, RandomAccessIterator3 conv_first, RandomAccessIterator3 conv_last)
Computes the FFT convolution.
Provides some FFT algorithms.
col_iterator col_begin(const size_type slice, const size_type col)
Returns a read/write iterator that points to the first element of the column column of the slice slic...
Provides some algorithms to computes arithmetical operations on ranges.
row_iterator row_begin(const size_type row)
Returns a read/write iterator that points to the first element of the row row in the Array2d...
iterator3d back_bottom_right()
Returns a read/write iterator3d that points to the past the end element of the Array3d. It points to past the end element of the back bottom right element of the Array3d.
void same_convolution(SrcIter first, SrcIter last, KernelIter kernel_first, KernelIter kernel_last, std::size_t ksize_left, std::size_t ksize_right, ResIter result, slip::BORDER_TREATMENT bt=slip::BORDER_TREATMENT_ZERO_PADDED)
Computes the same convolution of signal by a 1d-kernel.
void valid_convolution(SrcIter first, SrcIter last, KernelIter kernel_first, KernelIter kernel_last, std::size_t ksize_left, std::size_t ksize_right, ResIter result)
Computes the valid convolution of signal by a 1d-kernel.
void separable_convolution3d(RandomAccessIterator3d1 I_up, RandomAccessIterator3d1 I_bot, KernelIter1 k1_first, KernelIter1 k1_last, std::size_t ksize_left1, std::size_t ksize_right1, slip::BORDER_TREATMENT bt1, KernelIter2 k2_first, KernelIter2 k2_last, std::size_t ksize_left2, std::size_t ksize_right2, slip::BORDER_TREATMENT bt2, KernelIter3 k3_first, KernelIter3 k3_last, std::size_t ksize_left3, std::size_t ksize_right3, slip::BORDER_TREATMENT bt3, RandomAccessIterator3d2 R_up)
Computes the separable convolution of a 3d signal by 3 asymmetric 1d-kernels.
size_type cols() const
Returns the number of columns (second dimension size) in the Array2d.
std::iterator_traits< RandomAccessIterator1 >::value_type inner_product(RandomAccessIterator1 first1, RandomAccessIterator1 last1, RandomAccessIterator2 first2, typename std::iterator_traits< RandomAccessIterator1 >::value_type init=typename std::iterator_traits< RandomAccessIterator1 >::value_type())
Computes the inner_product of two ranges X and Y: .
void full_convolution2d(SrcIter2d S_up, SrcIter2d S_bot, KernelIter2d kernel_up, KernelIter2d kernel_bot, ResIter2d R_up, ResIter2d R_bot)
Computes the full convolution of 2d signal by a 2d-kernel.
slice_iterator slice_begin(const size_type row, const size_type col)
Returns a read/write iterator that points to the first element of the line (row,col) threw the slices...
void ifft2d(InputBidirectionalIterator2d in_upper_left, InputBidirectionalIterator2d in_bottom_right, OutputBidirectionalIterator2d out_upper_left)
Computes the ifft2d of a container with 2d iterators.
Provides a class to manipulate 3d dynamic and generic arrays.
col_iterator col_end(const size_type col)
Returns a read/write iterator that points one past the end element of the column column in the Array2...
void resize(std::size_t d1, std::size_t d2, std::size_t d3, const T &val=T())
Resizes a Array3d.
row_iterator row_end(const size_type row)
Returns a read/write iterator that points one past the end element of the row row in the Array2d...
void real_fft(InputIter in_begin, InputIter in_end, OutputIter out_begin)
Computes the real fft of a container.
Provides some algorithms to apply C like functions to ranges.
Numerical Signal class. This container statisfies the RandomAccessContainer concepts of the Standard ...
void full_convolution(SrcIter first, SrcIter last, KernelIter kernel_first, KernelIter kernel_last, ResIter result)
Computes the full convolution of signal by a 1d-kernel.
iterator begin()
Returns a read/write iterator that points to the first element in the Array2d. Iteration is done in o...
BORDER_TREATMENT
Choose between different border treatment modes for convolution algorithms.
This is a linear (one-dimensional) dynamic template container. This container statisfies the RandomAc...
void real_fft3d(InputBidirectionalIterator3d in_front_upper_left, InputBidirectionalIterator3d in_back_bottom_right, OutputBidirectionalIterator3d out_front_upper_left)
Computes the real fft3d of a container with 3d iterators.
Provides a class to manipulate numerical vectors.
This is a two-dimensional dynamic and generic container. This container statisfies the Bidirectionnal...
iterator begin()
Returns a read/write iterator that points to the first element in the Vector. Iteration is done in or...