Code Optimization and OOP programming
Show older comments
Hello :) ,
I have problems of runing time with the MatLab program I am working on, I hope someone could be able to give me a hand !
I am working with several classes and trying to use the power of OOP programming. But the size of the data I am working on is quite significant and I create huge arrays of classes object.
Before I show you part of the code in details, I explain that I am modestly familiar with the notion of MatLab code optimizing: I use the profiler to spot the slowness of my code, I pre-allocate my memory and I know what vectorization is.
I have a class called Vertix that has 6 properties, and I create an array V containing N "Vertix". N is big (around 100.000) ... Creating it and filling it is pretty fast (a few seconds), the problem is when I want to modify the following way.
I have :
vertices2change = ... ; % something small of 1xn size, like [ 3 5 7 ]
I want to access V(3), V(5) and V(7) to modify one of their properties. So I do :
for i=1:size(vertices2change,2)
V(vertices2change(i)).property = smthg ;
end
But this loop, of course, is VERY slow. Since I use it a lot in my code, this make my code run in hours, and according to the profiler, this is 99% the fault of this line...
The question is : how do I vectorize this line to make it faster ?
I already try the following but MatLab doesn't like it :
>> V(vertices2change).property = smthg
Insufficient number of outputs from function on right hand side of
equal sign to satisfy overloaded assignment.
Actually, the answer of
>> V(vertices2change).property
correspond to V(vertices2change(1)).property. Weird right ? At least there is something I didn't get !
I hope I was clear in my explainations and that my question wasn't stupid.
Thanks in advance ! :)
1 Comment
Babak
on 2 May 2013
just FYI, either say OO programming or OOP...
Accepted Answer
More Answers (2)
Antoine
on 2 May 2013
8 Comments
Matt J
on 2 May 2013
I get Out of memory because NxN is too big for my RAM (to find a contiguous block).
You could try a sparse matrix instead
V.property4=sparse(i,j,s,N,N,nzmax);
Philip Borghesani
on 2 May 2013
I would make property4 a cell array:
V.property4{i} = cat(2,V.property4{i},smthg) ;
Matt J
on 2 May 2013
A cell array of length 100000 will have the same RAM scattering problem as an object array of length 100000.
Antoine
on 2 May 2013
No, modifying things column-wise should be fastest. Make sure you're specifying nzmax. I also hope you're not starting with S equal to all zeros. You should initialize S with as much data as you can, using the syntax,
S=sparse(i,j,s,N,N,,nzmax)
Actually, Philip's suggestion of a cell array might be the best option you have. Every time you insert into a sparse matrix, the table of non-sparse entries has to be resorted...
Maybe you could also store things in a matrix with columns of the form
[idxA, idxB, smthg, zeros(1,pad)].'
If the smthg's are all of similar lengths, this might be too bad a way to encode things.
Antoine
on 2 May 2013
Antoine
on 7 May 2013
0 votes
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!