[petsc-users] Transpose of Block Matrix with aij type

Karl Rupp rupp at mcs.anl.gov
Wed Apr 24 16:18:07 CDT 2013


Hi Joon,

yes, MatGetSubMatrices should do the job - even though it copies the 
values. Just create the respective index sets for irow and icol 
directly. Have a look at at src/mat/examples/tests/ex51.c [1] on how to 
extract the matrices. Keep in mind that you need to specify all indices 
within a block (cf. MatGetSubMatrices man page [2])

Best regards,
Karli

[1] 
http://www.mcs.anl.gov/petsc/petsc-dev/src/mat/examples/tests/ex51.c.html
[2] 
http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatGetSubMatrices.html

On 04/24/2013 11:24 AM, Joon hee Choi wrote:
> Hi Karli,
>
> It may be a good idea to compute the result blocks directly. What function do I need to use for getting each block? I tried to use MatGetSubMatrices(Mat mat,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *submat[]), but I didn't know how I got irow[] and icol[] from block matrix.
>
> Best regards,
> Joon
>
> ----- 원래 메시지 -----
> 보낸 사람: "Karl Rupp" <rupp at mcs.anl.gov>
> 받는 사람: "Joon hee Choi" <choi240 at purdue.edu>
> 참조: petsc-users at mcs.anl.gov
> 보낸 시간: 2013년 4월 24일, 수요일 오후 12:07:11
> 제목: Re: [petsc-users] Transpose of Block Matrix with aij type
>
> Hi Joon,
>
> you're welcome - another idea: if you have just six matrices A1, A2, and
> B1-B4, it's worthwhile to compute the result blocks B1A1 + B2A2 and B3A1
> + B4A2 directly into temporary matrices using standard operations and
> compose the result into a single matrix. This way you can avoid the more
> expensive copies of A1, A2, B1-B4.
>
> Best regards,
> Karli
>
>
> On 04/24/2013 10:45 AM, Joon hee Choi wrote:
>> Hi Karli,
>>
>> Thank you. Actually, B is very huge(more than 10^10) and sparse(about 1% dense). 3x3 and 3x4 matrices were an example. I think I have to set up A again. Anyway, thank you again.
>>
>> Best regards,
>> Joon
>>
>>
>> ----- 원래 메시지 -----
>> 보낸 사람: "Karl Rupp" <rupp at mcs.anl.gov>
>> 받는 사람: "Choi240" <choi240 at purdue.edu>
>> 참조: petsc-users at mcs.anl.gov
>> 보낸 시간: 2013년 4월 23일, 화요일 오후 9:39:56
>> 제목: Re: [petsc-users] Transpose of Block Matrix with aij type
>>
>> Hi Joon,
>>
>> sorry, that was a pretty bad idea (wouldn't even work with square
>> matrices in general)
>>
>> I'm afraid you'll have to set up new matrices A, B with the respective
>> entries. For performance reasons you better use a dense format since
>> your matrices are so small.
>>
>> Best regards,
>> Karli
>>
>>
>> On 04/23/2013 06:05 PM, Choi240 wrote:
>>> Hi,
>>>
>>> Thank you for your reply. But A1,A2 are not square(3x4). B1~B4 are 3x3
>>> matrices. So A1*B1 is not impossible.
>>>
>>> Best regards,
>>> Joon
>>>
>>>
>>>
>>>
>>> -------- Original message --------
>>> Subject: Re: [petsc-users] Transpose of Block Matrix with aij type
>>> From: Karl Rupp <rupp at mcs.anl.gov>
>>> To: Choi240 <choi240 at purdue.edu>
>>> CC: petsc-users at mcs.anl.gov
>>>
>>>
>>> Hi again,
>>>
>>> if you have control over the structure of B, what about computing
>>> [A1 A2] * [B1 B3; B2 B4]
>>> instead?
>>>
>>> Best regards,
>>> Karli
>>>
>>>
>>> On 04/23/2013 05:17 PM, Choi240 wrote:
>>>    > Hi,
>>>    >
>>>    > I have to compute multiplication between two block matrices. It should
>>>    > be as follows:
>>>    >
>>>    > B1 | B2         A1        B1A1+B2A2
>>>    > ----------   *   ---   =   ---------------
>>>    > B3 | B4         A2        B3A1+B4A2
>>>    >
>>>    > However, I just have A =  [A1 A2]. So, I need to get A^T. Is there a way
>>>    > I can get the transpose of this block matrix with the MatTranspose()? Or
>>>    > do I have to use another function such as MatGetSubMatrices()?
>>>    >
>>>    > Thank you,
>>>    > Joon
>>>    >
>>>    >
>>>    >
>>>    > -------- Original message --------
>>>    > Subject: Re: [petsc-users] Transpose of Block Matrix with aij type
>>>    > From: Karl Rupp <rupp at mcs.anl.gov>
>>>    > To: petsc-users at mcs.anl.gov
>>>    > CC: choi240 at purdue.edu
>>>    >
>>>    >
>>>    > Hi,
>>>    >
>>>    > why would you expect that the transpose of a 3x8 matrix is not a
>>> 8x3-matrix?
>>>    >
>>>    > Best regards,
>>>    > Karli
>>>    >
>>>    >
>>>    > On 04/23/2013 03:27 PM, Joon hee Choi wrote:
>>>    >  > Hello,
>>>    >  >
>>>    >  > I tried to get transpose of block matrix(just with aij type), but the
>>>    > result was not a block matrix. For example,
>>>    >  >
>>>    >  > A =
>>>    >  > 1 2 3 4 | 4 3 2 1
>>>    >  > 2 3 4 5 | 5 4 3 2
>>>    >  > 3 4 5 6 | 6 5 4 3
>>>    >  >
>>>    >  >
>>>    >  > AT(expected) =
>>>    >  > 1 2 3 4
>>>    >  > 2 3 4 5
>>>    >  > 3 4 5 6
>>>    >  > -------
>>>    >  > 4 3 2 1
>>>    >  > 5 4 3 2
>>>    >  > 6 5 4 3
>>>    >  >
>>>    >  >
>>>    >  > AT(result) =
>>>    >  > 1 2 3
>>>    >  > 2 3 4
>>>    >  > 3 4 5
>>>    >  > 4 5 6
>>>    >  > 4 5 6
>>>    >  > 3 4 5
>>>    >  > 2 3 4
>>>    >  > 1 2 3
>>>    >  >
>>>    >  > If someone knows about this problem, please let me know it.
>>>    >  >
>>>    >  > Thank you
>>>    >  >
>>>    >
>>>
>>
>



More information about the petsc-users mailing list