Thanks Bibrak Qamar
On Mon, Dec 7, 2015 at 2:17 PM, Barry Smith <[email protected]> wrote: > > Presumably you are using a MPIAIJ matrix. You can use > > Mat x,A,B; > MatMPIAIJGetSeqAIJ(x,&A,&B,NULL); > > PetscScalar *a; > MatSeqAIJGetArray(A,&a); > MatInfo info; > MatGetInfo(A,MAT_LOCAL,&info); > for (i=0; i<info.nz_used; i++) { > a[i] = yourfunction(a[i]) > } > MatSeqAIJRestoreArray(A,&a); > /* do same thing for B matrix */ > > > On Dec 7, 2015, at 12:11 AM, Bibrak Qamar <[email protected]> wrote: > > > > Hi, > > > > I am trying to apply a function on each element of a matrix. The > function is the sigmoid function which transforms each element of the > matrix. > > > > I am trying to approach it like this but get error. What could be the > problem? Or is there a better way to do this? > > > > int sigmoid(Mat x){ > > printf("in sigmoid\n"); > > > > PetscErrorCode ierr; > > PetscInt Istart, Iend, Ii, Ji, rows, cols; > > > > PetscScalar v = 0.0; > > ierr = MatGetOwnershipRange(x,&Istart,&Iend);CHKERRQ(ierr); > > MatGetSize(x,&rows,&cols); > > > > for (Ii=Istart; Ii<Iend; Ii++) { > > for (Ji=0; Ji<cols; Ji++){ > > ierr = MatGetValues(x,1,&Ii,1,&Ji,&v);CHKERRQ(ierr); > > v = mysigmoid(v); > > ierr = MatSetValues(x,1,&Ii,1,&Ji,&v,INSERT_VALUES);CHKERRQ(ierr); > > } > > } > > > > MatAssemblyBegin(x,MAT_FINAL_ASSEMBLY); > > MatAssemblyEnd(x,MAT_FINAL_ASSEMBLY); > > > > > > MatView(x,PETSC_VIEWER_STDOUT_WORLD); > > } > > > > > > error msg is: > > > > [0]PETSC ERROR: --------------------- Error Message > -------------------------------------------------------------- > > [0]PETSC ERROR: Object is in wrong state > > [0]PETSC ERROR: Not for unassembled matrix > > [0]PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html > for trouble shooting. > > [0]PETSC ERROR: Petsc Release Version 3.6.3, Dec, 03, 2015 > > [ > > [0]PETSC ERROR: #1 MatGetValues() line 1780 in > /gpfs/home/petsc-3.6.3/src/mat/interface/matrix.c > > [0]PETSC ERROR: #2 sigmoid() line 21 in neural.c > > > > > > Thanks > > Bibrak Qamar > > > >
