# orth

Orthonormal basis for range of symbolic matrix

## Syntax

``orth(A)``
``orth(A,'real')``
``orth(A,'skipnormalization')``
``orth(A,'real','skipnormalization')``

## Description

example

````orth(A)` computes an orthonormal basis for the range of `A`.```

example

````orth(A,'real')` computes an orthonormal basis using a real scalar product in the orthogonalization process.```

example

````orth(A,'skipnormalization')` computes a non-normalized orthogonal basis. In this case, the vectors forming the columns of `B` do not necessarily have length 1.```

example

````orth(A,'real','skipnormalization')` computes a non-normalized orthogonal basis using a real scalar product in the orthogonalization process.```

## Examples

### Compute Orthonormal Basis

Compute an orthonormal basis of the range of this matrix. Because these numbers are not symbolic objects, you get floating-point results.

```A = [2 -3 -1; 1 1 -1; 0 1 -1]; B = orth(A)```
```B = -0.9859 -0.1195 0.1168 0.0290 -0.8108 -0.5846 0.1646 -0.5729 0.8029```

Now, convert this matrix to a symbolic object, and compute an orthonormal basis:

```A = sym([2 -3 -1; 1 1 -1; 0 1 -1]); B = orth(A)```
```B = [ (2*5^(1/2))/5, -6^(1/2)/6, -(2^(1/2)*15^(1/2))/30] [ 5^(1/2)/5, 6^(1/2)/3, (2^(1/2)*15^(1/2))/15] [ 0, 6^(1/2)/6, -(2^(1/2)*15^(1/2))/6]```

You can use `double` to convert this result to the double-precision numeric form. The resulting matrix differs from the matrix returned by the MATLAB® `orth` function because these functions use different versions of the Gram-Schmidt orthogonalization algorithm:

`double(B)`
```ans = 0.8944 -0.4082 -0.1826 0.4472 0.8165 0.3651 0 0.4082 -0.9129```

Verify that `B'*B = I`, where `I` is the identity matrix:

`B'*B`
```ans = [ 1, 0, 0] [ 0, 1, 0] [ 0, 0, 1]```

Now, verify that the 2-norm of each column of `B` is 1:

```norm(B(:, 1)) norm(B(:, 2)) norm(B(:, 3))```
```ans = 1 ans = 1 ans = 1```

### Compute Real Orthonormal Basis

Compute an orthonormal basis of this matrix using `'real'` to avoid complex conjugates:

```syms a A = [a 1; 1 a]; B = orth(A,'real')```
```B = [ a/(a^2 + 1)^(1/2), -(a^2 - 1)/((a^2 + 1)*((a^2 -... 1)^2/(a^2 + 1)^2 + (a^2*(a^2 - 1)^2)/(a^2 + 1)^2)^(1/2))] [ 1/(a^2 + 1)^(1/2), (a*(a^2 - 1))/((a^2 + 1)*((a^2 -... 1)^2/(a^2 + 1)^2 + (a^2*(a^2 - 1)^2)/(a^2 + 1)^2)^(1/2))] ```

### Compute Orthogonal Basis by Skipping Normalization

Compute an orthogonal basis of this matrix using `'skipnormalization'`. The lengths of the resulting vectors (the columns of matrix `B`) are not required to be 1

```syms a A = [a 1; 1 a]; B = orth(A,'skipnormalization')```
```B = [ a, -(a^2 - 1)/(a*conj(a) + 1)] [ 1, -(conj(a) - a^2*conj(a))/(a*conj(a) + 1)]```

### Compute Real Orthogonal Basis

Compute an orthogonal basis of this matrix using `'skipnormalization'` and `'real'`:

```syms a A = [a 1; 1 a]; B = orth(A,'skipnormalization','real')```
```B = [ a, -(a^2 - 1)/(a^2 + 1)] [ 1, (a*(a^2 - 1))/(a^2 + 1)]```

## Input Arguments

collapse all

Input, specified as a symbolic matrix.

collapse all

### Orthonormal Basis

An orthonormal basis for the range of matrix `A` is matrix `B`, such that:

• `B'*B = I`, where `I` is the identity matrix.

• The columns of `B` span the same space as the columns of `A`.

• The number of columns of `B` is the rank of `A`.

## Tips

• Calling `orth` for numeric arguments that are not symbolic objects invokes the MATLAB `orth` function. Results returned by MATLAB `orth` can differ from results returned by `orth` because these two functions use different algorithms to compute an orthonormal basis. The Symbolic Math Toolbox™ `orth` function uses the classic Gram-Schmidt orthogonalization algorithm. The MATLAB `orth` function uses the modified Gram-Schmidt algorithm because the classic algorithm is numerically unstable.

• Using `'skipnormalization'` to compute an orthogonal basis instead of an orthonormal basis can speed up your computations.

## Algorithms

`orth` uses the classic Gram-Schmidt orthogonalization algorithm.

## Version History

Introduced in R2013a