<div dir="ltr"><div class="gmail_default" style="font-family:courier new,monospace">​​Barry,<br><br>You are right about the importance of preallocation at MATLAB, but unfortunately this code doesn't do it.​<br><br>When the variable zzz is instantiated by zzz = zeros(m,n), MATLAB creates a zero dense matrix whose memory size is m*n*sizeof(doubles). However, the next code line is zzz = [i j x] which releases the previously preallocated space and creates a new one whose size is equal to the triple of the size of i (= sum of the sizes of i, j, and x). And the last line, A = spconvert(zzz), finally creates a new sparse matrix whose memory is not associated to the one of zzz. So, there is no preallocation.<br><br>I tested two codes to illustrate this. The first code uses the supposed preallocation and the second one doesn't do it. As you can see from the figure below (the same figure follows attached), the second version is much more faster. <br><br><img src="cid:ii_i52f632u2_14afd15dd72bb509" height="420" width="560"><br>Cheers,<br>Michael<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jan 17, 2015 at 7:56 PM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
  So it turns out my fix broke something else (I should have done more testing). I've attached the patch to the patch I provided for you. Apply this after the you apply the patch I previously sent you<br>  Or better start using the copy of the PETSc in the repository: <a href="http://www.mcs.anl.gov/petsc/developers/index.html" target="_blank">http://www.mcs.anl.gov/petsc/developers/index.html</a>  the branch maint corresponds to the last release plus some additional fixes. The branch master corresponds to the development copy that we are currently adding features to.<br>
<br>
   Barry<br>
<br>
> On Jan 17, 2015, at 3:46 PM, Barry Smith <<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>> wrote:<br>
><br>
><br>
>  Michael,<br>
><br>
>    Thanks for reporting this. I have fixed it in out maint and master branch and it will be fixed in our next patch update. I've also attached a patch file that you can use to update your copy of PETSc.<br>
> <fix-matview-matlab-name.patch><br>
><br>
> Note 1:  The reason for the zzz = zeros(3,3); is that for large matrices in Matlab it is (was?) much better to allocate a array of the correct final size before actually providing the entries in the matrix, otherwise Matlab would slowly dynamically keep increasing the size of the matrix as it found more entries in the matrix you provided. This is why we have this line.<br>
><br>
> zzz = zeros(3,3);<br>
> zzz = [<br>
> 1 1  1.0000000000000000e+00<br>
> 2 2  1.0000000000000000e+00<br>
> 3 3  1.0000000000000000e+00<br>
> ];<br>
> A = spconvert(zzz);<br>
><br>
> Note: 2 If the matrix is large at all you do not want to save as an ASII matlab file. Instead save using the binary viewer and use the PETSc Matlab script PetscBinaryRead() to read it into Matlab. This will be much much faster for large matrices. For tiny matrices using the ASCII viewer is fine.<br>
><br>
>   Thanks<br>
>   Barry<br>
><br>
><br>
><br>
>> On Jan 17, 2015, at 2:29 PM, Michael Souza <<a href="mailto:souza.michael@gmail.com">souza.michael@gmail.com</a>> wrote:<br>
>><br>
>> The name of variable created by MatView using PETSC_VIEWER_ASCII_MATLAB is not the expected one. More clearly, the name of variable is "zzz" no matter what you set by calling PetscObjectSetName.<br>
>><br>
>> The code below reproduces the unexpected behaviour. There, I create a diagonal MATMPIAIJ matrix and I set its name to "A", but the name of created variable in MATLAB's script is "zzz".<br>
>><br>
>> I also would like to point that there is no need to print the line "zzz = [m n];" once its value will not be used and it will produce an warning at Matlab's editor. So I think it could be removed.<br>
>><br>
>> Note: This strange behaviour doesn't occur with MATSEQAIJ matrices.<br>
>><br>
>> Cheers,<br>
>> Michael Souza<br>
>> ----------------------------------------------------------<br>
>> int main(int argc, char **args) {<br>
>>    PetscErrorCode ierr;<br>
>>    Mat A;<br>
>>    PetscInt i, N = 3;<br>
>><br>
>>    ierr = PetscInitialize(&argc, &args, (char *) 0, help);CHKERRQ(ierr);<br>
>><br>
>>    // matrix creation and setup<br>
>>    ierr = MatCreate(PETSC_COMM_WORLD, &A);CHKERRQ(ierr);<br>
>>    ierr = MatSetType(A, MATMPIAIJ);CHKERRQ(ierr);<br>
>>    ierr = MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, N, N);CHKERRQ(ierr);<br>
>>    ierr = MatSetUp(A);CHKERRQ(ierr);<br>
>>    for (i = 0; i < N; i++) {<br>
>>        ierr = MatSetValue(A, i, i, 1.0, INSERT_VALUES);CHKERRQ(ierr);<br>
>>    }<br>
>>    ierr = MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);<br>
>>    ierr = MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);<br>
>><br>
>>    // matlab viewer<br>
>>    ierr = PetscViewerSetFormat(PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_ASCII_MATLAB);CHKERRQ(ierr);<br>
>>    ierr = PetscObjectSetName((PetscObject) A, "A");CHKERRQ(ierr);<br>
>>    ierr = MatView(A, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);<br>
>><br>
>>    // free memory<br>
>>    ierr = MatDestroy(&A);CHKERRQ(ierr);<br>
>><br>
>>    ierr = PetscFinalize();CHKERRQ(ierr);<br>
>><br>
>>    return EXIT_SUCCESSSS;<br>
>> }<br>
>> ----------------------------------------------------------<br>
>><br>
><br>
<br>
<br></blockquote></div><br></div>