From 47a0088a40d246a857250a8e465f65764c6bbd7e Mon Sep 17 00:00:00 2001
From: Paul McCarthy <pauldmccarthy@gmail.com>
Date: Sat, 29 Jul 2017 20:03:29 +0100
Subject: [PATCH] Transform veclength/normalise functions can do multiple
 vectors at once

---
 fsl/utils/transform.py | 21 +++++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/fsl/utils/transform.py b/fsl/utils/transform.py
index 6932b6303..4fe7fe8e4 100644
--- a/fsl/utils/transform.py
+++ b/fsl/utils/transform.py
@@ -55,13 +55,26 @@ def concat(*xforms):
 
 
 def veclength(vec):
-    """Returns the length of the given vector. """
-    return np.sqrt(np.dot(vec, vec))
+    """Returns the length of the given vector(s).
+
+    Multiple vectors may be passed in, with a shape of ``(n, 3)``.
+    """
+    vec = np.array(vec, copy=False).reshape(-1, 3)
+    return np.sqrt(np.einsum('ij,ij->i', vec, vec))
 
 
 def normalise(vec):
-    """Normalises the given vector to unit length. """
-    return vec / veclength(vec)
+    """Normalises the given vector(s) to unit length.
+
+    Multiple vectors may be passed in, with a shape of ``(n, 3)``.
+    """
+    vec = np.array(vec, copy=False).reshape(-1, 3)
+    n   = (vec.T / veclength(vec)).T
+
+    if n.size == 3:
+        n = n[0]
+
+    return n
 
 
 def scaleOffsetXform(scales, offsets):
-- 
GitLab