From 5c8974df834ddb89217cd7242d12dfda1b4f3578 Mon Sep 17 00:00:00 2001
From: Nicola Vigano <nicola.vigano@esrf.fr>
Date: Mon, 14 Mar 2016 16:57:05 +0100
Subject: [PATCH] gtPlaceSubvolume: added non-integer shifts support

Signed-off-by: Nicola Vigano <nicola.vigano@esrf.fr>
---
 zUtil_Imaging/gtPlaceSubVolume.m | 36 ++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/zUtil_Imaging/gtPlaceSubVolume.m b/zUtil_Imaging/gtPlaceSubVolume.m
index 744e5402..f7b7a010 100644
--- a/zUtil_Imaging/gtPlaceSubVolume.m
+++ b/zUtil_Imaging/gtPlaceSubVolume.m
@@ -41,6 +41,41 @@ function output = gtPlaceSubVolume(output, input, shift, index, assign_op, use_c
         input = index .* input;
     end
 
+    if (all(shift == round(shift)))
+        output = place_sub_volume(output, input, shift, assign_op, use_c_functions);
+    else
+        inds = shift ~= round(shift);
+        pos_inds = find(inds);
+        output = place_sub_volume_at_inds(pos_inds, 1, output, input, shift, assign_op, use_c_functions);
+    end
+end
+
+function output = place_sub_volume_at_inds(pos_inds, coeff, output, input, shift, assign_op, use_c_functions)
+    if (isempty(pos_inds))
+        output = place_sub_volume(output, coeff * input, shift, assign_op, use_c_functions);
+    else
+        ind = pos_inds(1);
+        l_s_ind = floor(shift(ind));
+        u_s_ind = l_s_ind + 1;
+
+        l_c_ind = u_s_ind - shift(ind);
+        u_c_ind = 1 - l_c_ind;
+
+        l_shift = shift;
+        l_shift(ind) = l_s_ind;
+        u_shift = shift;
+        u_shift(ind) = u_s_ind;
+
+        if (l_c_ind > 0)
+            output = place_sub_volume_at_inds(pos_inds(2:end), l_c_ind * coeff, output, input, l_shift, assign_op, use_c_functions);
+        end
+        if (u_c_ind > 0)
+            output = place_sub_volume_at_inds(pos_inds(2:end), u_c_ind * coeff, output, input, u_shift, assign_op, use_c_functions);
+        end
+    end
+end
+
+function output = place_sub_volume(output, input, shift, assign_op, use_c_functions)
     inputSize = size(input);
     outputSize = size(output);
     num_input_dims = numel(inputSize);
@@ -150,3 +185,4 @@ function output = gtPlaceSubVolume(output, input, shift, index, assign_op, use_c
         end
     end
 end
+
-- 
GitLab