<div class="gmail_quote">On Tue, Sep 6, 2011 at 12:52,  <span dir="ltr">&lt;<a href="mailto:elam@cs.toronto.edu">elam@cs.toronto.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div id=":zj">Is it possible to reshape a vector into a matrix in PETSc?  I need to do<br>
this to compute a matrix vector multiplication (Ax) where the matrix A can<br>
be decomposed into Kronecker tensor format.  For example, A = A1 kron A2<br>
kron A3, where A1, A2, A3 are smaller sparse matrices.<br>
<br>
Essentially, I need to matricize the vector x and perform a series of<br>
matrix matrix multiplications to compute Ax.  In Matlab the function to<br>
perform the matricization is reshape.  Is there a similar function in<br>
PETSc?</div></blockquote></div><br><div>No, but there are two functions you can use to apply this operator. You would likely use both strategies, one for the first and one for the last part of the tensor product.</div><div>
<br></div><div>1. MatCreateMAIJ() creates a matrix that applies the same scalar operation to every component of a &quot;block&quot; in a normal vector. With an MAIJ matrix, MatMult() is semantically like reshaping in row-major order, doing a matrix-matrix multiply, and putting the result back in a flat vector.</div>
<div><br></div><div>2. Use VecGetArray() followed by MatMPIDenseSetPreallocation() to make a matrix in column-major order out of the same memory. Then you can MatMatMult() and make the result go back into a similar matrix.</div>