Documentation

# procrustes

Procrustes analysis

## Syntax

```d = procrustes(X,Y) [d,Z] = procrustes(X,Y) [d,Z,transform] = procrustes(X,Y) [...] = procrustes(...,'scaling',flag) [...] = procrustes(...,'reflection',flag) ```

## Description

`d = procrustes(X,Y)` determines a linear transformation (translation, reflection, orthogonal rotation, and scaling) of the points in matrix `Y` to best conform them to the points in matrix `X`. The goodness-of-fit criterion is the sum of squared errors. `procrustes` returns the minimized value of this dissimilarity measure in `d`. `d` is standardized by a measure of the scale of `X`, given by:

`sum(sum((X-repmat(mean(X,1),size(X,1),1)).^2,1))`

That is, the sum of squared elements of a centered version of `X`. However, if `X` comprises repetitions of the same point, the sum of squared errors is not standardized.

`X` and `Y` must have the same number of points (rows), and `procrustes` matches `Y(i)` to `X(i)`. Points in `Y` can have smaller dimension (number of columns) than those in `X`. In this case, `procrustes` adds columns of zeros to `Y` as necessary.

`[d,Z] = procrustes(X,Y)` also returns the transformed `Y` values.

`[d,Z,transform] = procrustes(X,Y)` also returns the transformation that maps `Y` to `Z`. `transform` is a structure array with fields:

• `c` — Translation component

• `T` — Orthogonal rotation and reflection component

• `b` — Scale component

That is:

```c = transform.c; T = transform.T; b = transform.b; Z = b*Y*T + c;```

`[...] = procrustes(...,'scaling',flag)`, when `flag` is `false`, allows you to compute the transformation without a scale component (that is, with `b` equal to `1`). The default `flag` is `true`.

`[...] = procrustes(...,'reflection',flag)`, when `flag` is `false`, allows you to compute the transformation without a reflection component (that is, with `det(T)` equal to `1`). The default `flag` is `'best'`, which computes the best-fitting transformation, whether or not it includes a reflection component. A `flag` of `true` forces the transformation to be computed with a reflection component (that is, with `det(T)` equal to `-1`)

## Examples

collapse all

Generate the sample data in two dimensions.

```rng('default') n = 10; X = normrnd(0,1,[n 2]);```

Rotate, scale, translate, and add some noise to sample points.

```S = [0.5 -sqrt(3)/2; sqrt(3)/2 0.5]; Y = normrnd(0.5*X*S+2,0.05,n,2);```

Conform `Y` to `X` using procrustes analysis.

`[d,Z,tr] = procrustes(X,Y);`

Plot the original `X` and `Y` with the transformed `Y` .

`plot(X(:,1),X(:,2),'rx',Y(:,1),Y(:,2),'b.',Z(:,1),Z(:,2),'bx');` ## References

 Kendall, David G. “A Survey of the Statistical Theory of Shape.” Statistical Science. Vol. 4, No. 2, 1989, pp. 87–99.

 Bookstein, Fred L. Morphometric Tools for Landmark Data. Cambridge, UK: Cambridge University Press, 1991.

 Seber, G. A. F. Multivariate Observations. Hoboken, NJ: John Wiley & Sons, Inc., 1984.