Defining 3D Cartesian reference frames based on the positions of at least 3 noncollinear points
The main function included in this package is called FRAME.
FRAME builds an orientation matrix R representing the orientation of a right handed 3D Cartesian reference frame, based on the position of at least 3 and at most 6 noncollinear points.
FRAME features an ARRAYLAB engine (see Matlab Central > File Exchange > Multiplying two ND arrays of matrices, vectors or scalars"). This means that FRAME accepts as input block arrays of vectors. In this case, it returns a block array of orientation matrices (see below).
Several different reference frame orientations can be defined by the same set of points. For instance, the same three points can be used to define 72 different orientations for a righthanded 3D Cartesian reference frame! Three noncollinear points define a triangle and a plane, which in turn define seven lines (six are parallel to the three sides and the three heights of the triangle, and the seventh is normal to the plane; fig. 1). Since for each line there are two opposite directions, any of the Cartesian axes can be assigned 14 different directions. And any of these 14 directions is normal to 4 or 12 of the other directions, all of which can be used to define the other axes.
FRAME is a versatile algorithm. It can be used to determine any of the above mentioned orientations. Its input arguments include three directed distances (d1, d2, and d3), obtained from the known point positions with vector subtractions. For instance, if pA and pB are the positions of two points A and B, pBpA (or pA+pB) is the directed distance from point A to point B.
Since d1 may coincide with d3, three points are enough to define the three distances. For instance, three position vectors (pA, pB, pC) might be used as follows:
R = FRAME(pA+pB, pB+pC, 'y', pA+pB, 'z', DIM)
and six position vectors (pA, pB, pC, pD, pE, pF) might be used as follows:
R = FRAME(pA+pB, pC+pD, 'y', pE+pF, 'z', DIM)
where DIM is the dimension along which the vectors are contained.
The direction of the first axis ('y' in the above examples) is defined by the vector product d1 × d2. The direction of the second axis ('z' in the above example) is defined by the rejection of d3 from the first axis, coinciding with the projection of d3 on the plane defined by d1 and d2. The third axis forms with the others a right handed orthogonal reference frame. A more detailed explanation of the function syntax and the rules used to build the output array R can be found on the FRAME help text.
If pA, pB, etc. are 3by1 matrices, DIM = 1 and R is a single 3by3 orientation matrix.
The arrays pA, pB, etc. can have any size, provided they contain 3element position vectors along one of their dimensions (DIM). For instance, if they are Nfby3 matrices, containing Nf positions of a moving point, sampled with a stereophotogrammetric motion capture system, R is a Nfby3by3 array, containing Nf orientation matrices. See FRAME help for details about the format of the input and output arrays.
Any matrix or array of orientation matrices R obtained with FRAME can be used to perform transformations. Multiple vector transformations can be obtained by multiplying an array of orientation matrices by an array of vectors. This "multiproduct" can be performed easily, in a single step and with no loops, by calling function MULTIPROD.
MULTIPROD is a powerful generalization for ND arrays of the MATLAB function MTIMES and the matrix multiplication operator (*). Obviously, MULTIPROD has a broad field of potential applications. For instance, it can be used to perform vector algebra (see package "Matlab Central > File Exchange > Vector algebra for multidimensional arrays of vectors"). Thus, in my opinion it deserved a separate introduction and I published it in a separate package: "Matlab Central > File Exchange > Multiplying two ND arrays of matrices, vectors or scalars".
A few sample functions are included in this package. They determine the orientation of anatomical reference frames for segments of the human body (thorax, scapula, upper arm, arm, forearm, hand, pelvis, thigh, shank, foot), according to the definitions given by Cappozzo et al. (1995; Clinical Biomechanics, 10, 171178) and by van der Helm et al. (2005; Journal of Biomechanics, 38, 981992).
The code (testFRAME) I used to test the function output is included as well.
1.3  Updated manual 

1.2  New help text. More userfriendly version of function testFRAME. 

The code was optimized according to suggestions automatically generated by function MLint. 

The code was optimized according to suggestions automatically generated by function MLint. 

Updated requirement section and manual. 

In the previous update I didn't realize apostrophes (') were converted into q. marks. Now I changed the summary, further refined the description, added a Manual in attached file and a screenshot. 

Keyword list Summary and Description were updated. The keyword list and Summary had been truncated arbitrarily and not readable. Some characters in the Description were not readable and some refinements were needed. 
A very flexible and handy function, no array dimension bonds. A very clear manual which aids you to use this function in several contexts.