# MatRARt
Creates the matrix product C = R * A * R^T 
## Synopsis
```
#include "petscmat.h" 
PetscErrorCode MatRARt(Mat A, Mat R, MatReuse scall, PetscReal fill, Mat *C)
```
Neighbor-wise Collective


## Input Parameters

- ***A -*** the matrix
- ***R -*** the projection matrix
- ***scall -*** either `MAT_INITIAL_MATRIX` or `MAT_REUSE_MATRIX`
- ***fill -*** expected fill as ratio of nnz(C)/nnz(A), use `PETSC_DEFAULT` if you do not have a good estimate
if the result is a dense matrix this is irrelevant



## Output Parameters

- ***C -*** the product matrix





## Notes
C will be created and must be destroyed by the user with `MatDestroy()`.

An alternative approach to this function is to use `MatProductCreate()` and set the desired options before the computation is done

This routine is currently only implemented for pairs of `MATAIJ` matrices and classes
which inherit from `MATAIJ`. Due to PETSc sparse matrix block row distribution among processes,
parallel MatRARt is implemented via explicit transpose of R, which could be very expensive.
We recommend using MatPtAP().


## See Also
 `Mat`, `MatProductCreate()`, `MatMatMult()`, `MatPtAP()`

## Level
intermediate

## Location
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/src/mat/interface/matrix.c.html#MatRARt">src/mat/interface/matrix.c</A>


---
[Edit on GitLab](https://gitlab.com/petsc/petsc/-/edit/release/src/mat/interface/matrix.c)


[Index of all Mat routines](index.md)  
[Table of Contents for all manual pages](/docs/manualpages/index.md)  
[Index of all manual pages](/docs/manualpages/singleindex.md)  
