1
$\begingroup$

I have a list of coordinates (coord):

{{59.1915, 42.0843}, {62.0695, 71.2996}, {48.4124, 52.1423}, 
 {51.3325,60.8624}, {54.8544, 44.72}, {55.39, 63.9032},
 {59.1566,67.2319}, {48.1271, 57.0733}, {63.0908, 76.0996}, 
 {50.644, 47.5917}}

Using:

diffcoord = Differences[coord]

I can calculate the difference between consecutive coordinates:

{{2.87796, 29.2153}, {-13.6571, -19.1573}, {2.9201, 8.7201}, 
 {3.52192, -16.1424}, {0.53561, 19.1832}, {3.76663, 3.32865}, 
 {-11.0295, -10.1585}, {14.9637, 19.0262}, {-12.4468, -28.5079}}

Now, I want to calculate:

d = dx1*dx2 + dy1*dy2

for each pair of differenced coordinate in the list. where $dx_1 = x_2-x_1, dy_1=y_2-y_1$ (which is the first element of the diffcoord list)

I was trying to use Dotbut I found out that it's not going to do I want. Is there a command like Differences or Accumulate that does what I need.

More info:

I am trying to calculate the correlation between unit tangent vectors (uni-leipzig.de/~pwm/web/?section=introduction&page=polymers). To calculate unit tangent vector, I need to take the derivative of the curve at that point. Since it's cubic spline, I can't do so. I am trying to approximate it by (iiserpune.ac.in/~cathale/lects/bio322-phybio1/2013bio322/…) . Do you know of any better way to do it?

This question is a follow-up to this question: How to find a length of a curve constructed using Spline?

$\endgroup$
3
  • 3
    $\begingroup$ Wait… did you want to take the dot product for the original list, or for the differenced one? In any event: Dot @@@ Partition[(* coordinates *), 2, 1]. $\endgroup$ Commented May 15, 2015 at 15:12
  • $\begingroup$ Differenced ones. I Just added more info to get my point across. $\endgroup$
    – sra
    Commented May 15, 2015 at 15:14
  • $\begingroup$ "Since it's cubic spline, I can't do so." - well, actually, you can. Here is a sketch: the routines I gave here for generating cubic B-splines ought to also work in 3D; having generated the parameter values and control points, you can then explicitly generate the component functions with a procedure similar to the one in this answer to generate the unit tangent vector. $\endgroup$ Commented May 15, 2015 at 16:31

4 Answers 4

4
$\begingroup$

Here's how I'd do it. Starting with diffcoord

diffcoord = {{2.87796, 29.2153}, {-13.6571, -19.1573}, {2.9201, 
  8.7201}, {3.52192, -16.1424}, {0.53561, 19.1832}, {3.76663, 
  3.32865}, {-11.0295, -10.1585}, {14.9637, 
  19.0262}, {-12.4468, -28.5079}};

Pair each element with the next and Dot the pairs.

Dot@@@(Transpose@{diffcoord[[1;;-2]],diffcoord[[2;;-1]]})

The output is

{-598.991, -206.934, -130.479, -307.777, 65.8716, -75.3581, -358.32,
-728.647}

There is certainly a more clever way to combine the two if you need to do this on huge lists, but this makes sense to me.

Edit: @Guess who it is reminded me that Partition has a 3rd argument to specify an offset, which makes this a lot nicer looking!

Dot@@@Partition[diffcoord,2,1]
$\endgroup$
3
  • 1
    $\begingroup$ Would've used Partition[] myself… :) $\endgroup$ Commented May 15, 2015 at 16:35
  • $\begingroup$ I am so new to Mathematica. I don't know much about it's power. @Guesswhoitis. your suggestion worked. However, I do not understand what Dot@@@ is doing. I am currently in the process of reading : mathprogramming-intro.org/download/MathProgrammingIntro.pdf .. I think I will get to Map in 3-4 days. $\endgroup$
    – sra
    Commented May 15, 2015 at 17:00
  • 2
    $\begingroup$ @psimeson, a tip: everytime you encounter an unfamiliar function or operator, highlight it on the front end and press F1. In this case, you should be seeing the entry for Apply[] $\endgroup$ Commented May 15, 2015 at 17:07
3
$\begingroup$

enter image description here

lst = {{59.1915, 42.0843}, {62.0695, 71.2996}, {48.4124, 
    52.1423}, {51.3325, 60.8624}, {54.8544, 44.72}, {55.39, 
    63.9032}, {59.1566, 67.2319}, {48.1271, 57.0733}, {63.0908, 
    76.0996}, {50.644, 47.5917}};

BlockMap[Apply[Dot], Differences@lst, 2, 1]

{-598.991, -206.934, -130.479, -307.777, 65.8725, -75.3586, -358.323,
-728.65}

As of v10.2 PartitionMap has been superseded by BlockMap.

$\endgroup$
2
$\begingroup$

You can use PartitionMap from Developer package, e.g.

lst = {{59.1915, 42.0843}, {62.0695, 71.2996}, {48.4124, 
    52.1423}, {51.3325, 60.8624}, {54.8544, 44.72}, {55.39, 
    63.9032}, {59.1566, 67.2319}, {48.1271, 57.0733}, {63.0908, 
    76.0996}, {50.644, 47.5917}};
Developer`PartitionMap[Dot @@ # &, Differences@lst, 2, 1]

yields:

{-598.991, -206.934, -130.479, -307.777, 65.8725, -75.3586, -358.323, \
-728.65}

A recent answer by Mr. Wizard brought this to my attention. I post in case others not aware.

$\endgroup$
0
$\begingroup$

Your wording is very ambiguous. You start with coordinates, then calculate the differences between successive points, and then claim you want to calculate dx1*dx2 + dxy*dy2 for each pair of coordinate [sic] in the list. Do you mean for each successive pair of two-element lists? Or the outer product, i.e., the differences between the each two-element list and every other two element list?

Please be clear.

You might mean you want the below (but I'm not sure):

Norm[#]^2 & /@ 
 Differences[{{2.87796, 29.2153}, {-13.6571, -19.1573}, {2.9201, 
    8.7201}, {3.52192, -16.1424}, {0.53561, 19.1832}, {3.76663, 
    3.32865}, {-11.0295, -10.1585}, {14.9637, 
    19.0262}, {-12.4468, -28.5079}}]
$\endgroup$
1
  • $\begingroup$ I edited my question. Thanks for pointing out. English is not my first language so I can't express myself clearly. $\endgroup$
    – sra
    Commented May 15, 2015 at 15:17

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.