5.0

5.0 | 4 ratings Rate this file 48 downloads (last 30 days) File Size: 25.27 KB File ID: #23488

Sparse sub access

by Bruno Luong

 

30 Mar 2009 (Updated 10 Jan 2010)

Code covered by the BSD License  

This package allows to retrieve and assign values of sparse matrix in one shot.

Download Now | Watch this File

File Information
Description

The indexes must be provided in (row,column) form. Functions in this package are programmed with care so no overflow of linear index is used with large-size matrix. I try to design an engine of automatic selection algorithms so as to provide a good run time performance across various cases. I'm not sure it's worth the effort, but my experience shows that it is easy to mess with the performance when non-appropriate method is using in sparse manipulation. This package does not warranty for best performance, but it just has a modest pretension to prevent user to use bad algorithm. For a better customize solution, a calibration is required on the specific
computer by running this command: spcalib('auto')

Acknowledgements
This submission has inspired the following:
Robust Sparse data types
MATLAB release MATLAB 7.7 (R2008b)
Zip File Content  
Other Files
license.txt,
sparsesubaccess/asgn.m,
sparsesubaccess/bugsparseindexing.m,
sparsesubaccess/defaultTref.m,
sparsesubaccess/defaultTrefOrg.m,
sparsesubaccess/getsparse.m,
sparsesubaccess/getspvalmex.c,
sparsesubaccess/maxlinind.m,
sparsesubaccess/README.txt,
sparsesubaccess/setsparse.m,
sparsesubaccess/setspvalmex.c,
sparsesubaccess/sparsenc.m,
sparsesubaccess/spcalib.m,
sparsesubaccess/spidx_install.m,
sparsesubaccess/spsubsasgn.m,
sparsesubaccess/spsubsref.m,
sparsesubaccess/testsparse.m
Tags for This File  
Everyone's Tags
Tags I've Applied
Add New Tags Please login to tag files.
Comments and Ratings (10)
01 Aug 2009 Anthony Lamb

Very good!!!! It works well for building global stiffness matrices for finite element computations. While building my stiffness matrices I currently do the following
      val = getspvalmex(A_global, Ic, Jr);
      A_global = setspvalmex(A_global, Ic, Jr, val+X);

Bruno...Is there any other way your code can be used to get this done??

01 Aug 2009 Anthony Lamb

Sorry about that.... I think that the following code does the trick
 
A_global = setspvalmex(A_global, Ic, Jr, X,@plus);

16 Dec 2009 Matt J

Bruno - When I do

 mex -v -O setspvalmex.c

I get a compilation error:

Error setspvalmex.c: 626 compiler error in _kids--Bad rule number 0
 
  C:\PROGRA~1\MATLAB\R2009B\BIN\MEX.PL: Error: Compile of 'setspvalmex.c' failed.

Any idea what I'm doing wrong?

16 Dec 2009 Bruno Luong

Hello Matt,

After investigation, it turns out the "_kids--Bad rule" message is caused by a bug of the LCC compiler.

A workaround is to replace the or "|" operator by plus "+" operator in the cmex file setspvalmex.c, lines #626, 634 and 709, then recompile.

Thanks for report the bug. I'll submit a new version.

Bruno

31 Dec 2009 Matt J

Yep, that workaround fixed it. Anyway, I like it!!

11 Jan 2010 James Tursa

Bruno,
FYI, my experience is that lcc has bugs with the unsigned long long type ... I often get a "bad rule" compile error. I have gotten into the habit of using signed long long instead and writing extra code to handle situations where I need to shift into or out of the sign bit. A real hassle just so the lcc compiler that ships with MATLAB will work with my code.

11 Jan 2010 Bruno Luong

Thanks for the tip James.

03 Mar 2010 H

Bruno, Thank you very much for this package. Also thank you for all your help in the forums.

This works appr. 30 times faster than using linear indexing to zero sparse matrix columns that I used before!

03 Mar 2010 H

This seems to have one problem though:

Before I used A(:,indexes)=0, it just took a lot of time.

No I tried

[I J]=find(A);
idxofzero = ismember(J,indexes);
A=setsparse(A,I(idxofzero),J(idxofzero),0);

And I get "out of memory error". I tried it several times with both methods and got the same result. Am I missing something here?

My sparse matrix is about 55,000 x 55,000 and it has 4,060,200 nnz elements. The indexes hold about 1/100 of the columns.

04 Mar 2010 Bruno Luong

Hello H,

I can't really help with memory problem. The suggestion I can give is to try on your side to increase the free largest memory block from other places. Thanks for the kind words.

Bruno

Please login to add a comment or rating.
Updates
31 Mar 2009

Add a feature of bi-variate function-handle when assign values

01 Apr 2009

Adjust the maximum of linear index allowed according to bug information communicated by The Mathworks (applicable only for 32-bit platform, v.2009A or previous)

03 Apr 2009

A brand new mex implementation that overcome Matlab indexing Bug (32 bit platform) and improve the speed by approximately a factor of 4.

06 Apr 2009

More comprehensive calibration
Correct mex-build command for 64-bit platform
Many small improvements and bug fixes

11 Apr 2009

A new mex sparse assign engine is developped from scratch using quicksort. Finally, we beat adding routine by about 40% of speed. More comprehensive calibration routine is included.

15 Apr 2009

Correct a bug in setspvalmex.c, which concerns 64-bit only

17 Apr 2009

Correct bug when calling setspvalmex.c with empty indice.
This code is also ready to compiled using INTROSORT, however QUICKSORT is still retained as default engine.

16 Dec 2009

Workaround for BUG of LCC (related to "|" operator in expression with int64)

10 Jan 2010

switch the sort-engine of setsparse to introsort which is more stable than quicksort (previously used) in term of complexity

Tag Activity for this File
Tag Applied By Date/Time
sparse Bruno Luong 31 Mar 2009 11:40:39
matrix Bruno Luong 31 Mar 2009 11:40:39
large size Bruno Luong 31 Mar 2009 11:40:39
sub indexing Bruno Luong 01 Apr 2009 02:20:14
linear indexing Bruno Luong 01 Apr 2009 02:20:15
spfun Bruno Luong 01 Apr 2009 02:20:15
update Bruno Luong 01 Apr 2009 02:20:15
 

MATLAB Central Terms of Use

NOTICE: Any content you submit to MATLAB Central, including personal information, is not subject to the protections which may be afforded information collected under other sections of The MathWorks, Inc. Web site. You are entirely responsible for all content that you upload, post, e-mail, transmit or otherwise make available via MATLAB Central. The MathWorks does not control the content posted by visitors to MATLAB Central and, does not guarantee the accuracy, integrity, or quality of such content. Under no circumstances will The MathWorks be liable in any way for any content not authored by The MathWorks, or any loss or damage of any kind incurred as a result of the use of any content posted, e-mailed, transmitted or otherwise made available via MATLAB Central. Read the complete Terms prior to use.

Contact us at files@mathworks.com