Efficient data storage for real-time simulation
이전 댓글 표시
I am currently working on a real-time simulation using MATLAB and MEX-files. I have a triangulated mesh of ~2000 vertices and ~4000 faces stored in two matrices v (Nx3, N:number of vertices and 3-dimensions) and f. I am using a mass-spring model to simulate deformations, for which I am constantly pulling and inserting data from the vertex matrix v to calculate displacements, distances, spring-forces etc. The reason why I am storing in Nx3 format is to be able to plot using trisurf(f,v(:,1), v(:,2), v(:,3)).
I am currently not reaching my target updates of 20 iterations/sec (currently around ~11 iterations/sec) and the profiler does not really target any specific area in the code for improvement. I am wondering if maybe a different approach to store the vertices may be more efficient? E.g. storing the vertices in a 3*Nx1 long vector instead. This would not make it suitable for trisurf though. Thoughts or comments?
Current version, pseudo-code:
for t=1:T
for i = 1:N
%Pull vertex i
xi = v(i,:); %xi = [x_i y_i z_i]
for k = 1:numConn(i) %number of connections numConn(i) is precomputed
%Pull a vertex
j=connection(k,i); %j equals a row in v, i.e a vertex
xj=v(j,:);
%Distance
xij=xi-xj;
d = sqrt(xij*xij');
end
...
%Update
v(i,:)=v(i,)+f(d,xi,vj,t);
end
%Plot
trisurf(f,v(:,1),v(:,2),v(:,3));
drawnow;
end
댓글 수: 4
You are mentioning in a comment below that it's not possible to vectorize inner loops completely; the only reason that I can see (but I spent 2 minutes on it, so I am probably wrong), it the way you are using an array of connections that is extracted from somewhere as a function of the vertex ID. Have you tried to use a matrix of connections instead and get v at t+1 as a product of matrices (force, connections_flag, interVertex_dist, v@t) ..?
Wouter
2013년 3월 21일
If you have the parallel processing toolbox, you could perhaps try to make the code run parallel on all you processors; this could theoretically speed up the execution (if processing power is actually the limiting factor).
If you are lucky, you could change the inner for loop into this:
parfor k = 1:numConn(i)
however I suspect that your iterations depend on previous iterations (line v(i,:) = v(i,:)+f(d,xi,vj,t). In that case ignore my comment :)
채택된 답변
추가 답변 (1개)
카테고리
도움말 센터 및 File Exchange에서 Performance and Memory에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!