# clifford.MultiVector¶

class clifford.MultiVector(layout, value=None, string=None, *, dtype: numpy.dtype = <class 'numpy.float64'>)[source]

An element of the algebra

Parameters
• layout (instance of clifford.Layout) – The layout of the algebra

• value (sequence of length layout.gaDims) – The coefficients of the base blades

• dtype (numpy.dtype) –

The datatype to use for the multivector, if no value was passed.

New in version 1.1.0.

Notes

• A * B : geometric product

• A ^ B : outer product

• A | B : inner product

• A << B : left contraction

• ~M : reversion

• M(N) : grade or subspace projection

• M[N] : blade projection

exp() → clifford._multivector.MultiVector[source]
vee(other) → clifford._multivector.MultiVector[source]

Vee product $$A \vee B$$.

This is often defined as:

$\begin{split}(A \vee B)^* &= A^* \wedge B^* \\ \implies A \vee B &= (A^* \wedge B^*)^{-*}\end{split}$

This is very similar to the meet() function, but always uses the dual in the full space .

Internally, this is actually implemented using the complement functions instead, as these work in degenerate metrics like PGA too, and are equivalent but faster in other metrics.

__and__(other) → clifford._multivector.MultiVector[source]

self & other, an alias for vee()

__mul__(other) → clifford._multivector.MultiVector[source]

self * other, the geometric product $$MN$$

__xor__(other) → clifford._multivector.MultiVector[source]

self ^ other, the Outer product $$M \wedge N$$

__or__(other) → clifford._multivector.MultiVector[source]

self | other, the inner product $$M \cdot N$$

__add__(other) → clifford._multivector.MultiVector[source]

self + other, addition

__sub__(other) → clifford._multivector.MultiVector[source]

self - other, Subtraction

right_complement() → clifford._multivector.MultiVector[source]
left_complement() → clifford._multivector.MultiVector[source]
as_array()numpy.ndarray[source]
mag2()numbers.Number[source]

Magnitude (modulus) squared, $${|M|}^2$$

Note in mixed signature spaces this may be negative

adjoint() → clifford._multivector.MultiVector[source]

Adjoint / reversion, $$\tilde M$$

Aliased as ~M to reflect $$\tilde M$$, one of several conflicting notations.

Note that ~(N * M) == ~M * ~N.

__invert__() → clifford._multivector.MultiVector

Adjoint / reversion, $$\tilde M$$

Aliased as ~M to reflect $$\tilde M$$, one of several conflicting notations.

Note that ~(N * M) == ~M * ~N.

__getitem__(key: Union[MultiVector, tuple, int])numbers.Number[source]

value = self[key].

If key is a blade tuple (e.g. (0, 1) or (1, 3)), or a blade, (e.g. e12), then return the (real) value of that blade’s coefficient. Otherwise, treat key as an index into the list of coefficients.

__call__(other, *others) → clifford._multivector.MultiVector[source]

Return a new multi-vector projected onto a grade or another MultiVector

M(g1, ... gn) gives $$\left<M\right>_{g1} + \cdots + \left<M\right>_{gn}$$

M(N) calls project() as N.project(M).

Examples

>>> from clifford.g2 import *
>>> M = 1 + 2*e1 + 3*e12
>>> M(0)
1
>>> M(0, 2)
1 + (3^e12)

clean(eps=None) → clifford._multivector.MultiVector[source]

Sets coefficients whose absolute value is < eps to exactly 0.

eps defaults to the current value of the global _settings._eps.

round(eps=None) → clifford._multivector.MultiVector[source]

Rounds all coefficients according to Python’s rounding rules.

eps defaults to the current value of the global _settings._eps.

lc(other) → clifford._multivector.MultiVector[source]

The left-contraction of two multivectors, $$M\rfloor N$$

property pseudoScalar

Returns a MultiVector that is the pseudoscalar of this space.

property I

Returns a MultiVector that is the pseudoscalar of this space.

invPS() → clifford._multivector.MultiVector[source]

Returns the inverse of the pseudoscalar of the algebra.

isScalar()bool[source]

Returns true iff self is a scalar.

isBlade()bool[source]

Returns true if multivector is a blade.

isVersor()bool[source]

Returns true if multivector is a versor. From Leo Dorsts GA for computer science section 21.5, definition from 7.6.4

grades(eps=None) → Set[int][source]

Return the grades contained in the multivector.

Changed in version 1.1.0: Now returns a set instead of a list

Changed in version 1.3.0: Accepts an eps argument

property blades_list

ordered list of blades present in this MV

normal() → clifford._multivector.MultiVector[source]

Return the (mostly) normalized multivector.

The _mostly_ comes from the fact that some multivectors have a negative squared-magnitude. So, without introducing formally imaginary numbers, we can only fix the normalized multivector’s magnitude to +-1.

$$\frac{M}{|M|}$$ up to a sign

leftLaInv() → clifford._multivector.MultiVector[source]

Return left-inverse using a computational linear algebra method proposed by Christian Perwass.

normalInv(check=True) → clifford._multivector.MultiVector[source]

The inverse of itself if $$M \tilde M = |M|^2$$.

$M^{-1} = \tilde M / (M \tilde M)$
Parameters

check (bool) – When true, the default, validate that it is appropriate to use this method of inversion.

inv() → clifford._multivector.MultiVector[source]
leftInv() → clifford._multivector.MultiVector

Return left-inverse using a computational linear algebra method proposed by Christian Perwass.

rightInv() → clifford._multivector.MultiVector

Return left-inverse using a computational linear algebra method proposed by Christian Perwass.

dual(I=None) → clifford._multivector.MultiVector[source]

The dual of the multivector against the given subspace I, $$\tilde M = MI^{-1}$$

I defaults to the pseudoscalar.

commutator(other) → clifford._multivector.MultiVector[source]

The commutator product of two multivectors.

$$[M, N] = M \times N = (MN + NM)/2$$

x(other) → clifford._multivector.MultiVector

The commutator product of two multivectors.

$$[M, N] = M \times N = (MN + NM)/2$$

anticommutator(other) → clifford._multivector.MultiVector[source]

The anti-commutator product of two multivectors, $$(MN + NM)/2$$

gradeInvol() → clifford._multivector.MultiVector[source]

The grade involution of the multivector.

$M^* = \sum_{i=0}^{\text{dims}} {(-1)^i \left<M\right>_i}$
property even

Even part of this multivector

defined as M + M.gradInvol()

property odd

Odd part of this mulitvector

defined as M +- M.gradInvol()

conjugate() → clifford._multivector.MultiVector[source]

The Clifford conjugate (reversion and grade involution).

$$M^*$$ = (~M).gradeInvol()

project(other) → clifford._multivector.MultiVector[source]

Projects the multivector onto the subspace represented by this blade.

$$P_A(M) = (M \rfloor A) A^{-1}$$

factorise() → Tuple[List[clifford._multivector.MultiVector], numbers.Number][source]

Factorises a blade into basis vectors and an overall scale.

Uses Leo Dorsts algorithm from 21.6 of GA for Computer Science

basis() → List[clifford._multivector.MultiVector][source]

Finds a vector basis of this subspace.

join(other) → clifford._multivector.MultiVector[source]

The join of two blades, $$J = A \cup B$$

Similar to the wedge, $$W = A \wedge B$$, but without decaying to 0 for blades which share a vector.

meet(other, subspace=None) → clifford._multivector.MultiVector[source]

The meet of two blades, $$A \cap B$$.

Computation is done with respect to a subspace that defaults to the join() if none is given.

Similar to the vee(), $$V = A \vee B$$, but without decaying to 0 for blades lying in the same subspace.

astype(*args, **kwargs)[source]

Change the underlying scalar type of this vector.

Can be used to force lower-precision floats or integers

See np.ndarray.astype for argument descriptions.