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