Skip to main content
`Ctrl`+`K`

# BVMatProject

Computes the projection of a matrix onto a subspace.

## Synopsis

    #include "slepcbv.h"
    PetscErrorCode BVMatProject(BV X,Mat A,BV Y,Mat M)

Collective

## Input Parameters

- X - basis vectors

- A - (optional) matrix to be projected

- Y - left basis vectors, can be equal to `X`

## Output Parameter

- M - the resulting matrix

## Notes

If `A=NULL`, then it is assumed that `X` already contains \(AX\).

This operation is similar to `BVDot()`, with important differences. The goal is to compute the matrix resulting from the orthogonal projection of `A` onto the subspace spanned by the columns of `X`, \(M = X^*AX\), or the oblique projection onto `X` along `Y`, \(M = Y^*AX\).

A difference with respect to `BVDot()` is that the standard inner product is always used, regardless of a non-standard inner product being specified with `BVSetMatrix()`.

On entry, `M` must be a sequential dense `Mat` with dimensions `ky,kx` at least, where `ky` (resp. `kx`) is the number of active columns of `Y` (resp. `X`). Another difference with respect to `BVDot()` is that all entries of `M` are computed except the leading `ly,lx` part, where `ly` (resp. `lx`) is the number of leading columns of `Y` (resp. `X`). Hence, the leading columns of `X` and `Y` participate in the computation, as opposed to `BVDot()`. The leading part of `M` is assumed to be already available from previous computations.

In the orthogonal projection case, `Y=X`, some computation can be saved if `A` is real symmetric (or complex Hermitian). In order to exploit this property, the symmetry flag of `A` must be set with `MatSetOption()`.

## See Also

BV: Basis Vectors, `BVDot()`, `BVSetActiveColumns()`, `BVSetMatrix()`, `MatSetOption()`

## Level

intermediate

## Location

src/sys/classes/bv/interface/bvglobal.c

Index of all BV routines Table of Contents for all manual pages Index of all manual pages