Refactor mju_combineSparse to eliminate temporary buffers.
Combine sparse vectors in-place by first counting total `nnz` and then working backwards from the end. This removes the need for temporary buffers in `mju_combineSparse` and its callers and speeds up the function by ~10%. PiperOrigin-RevId: 902530210 Change-Id: I4f48c327103552ab968d3915399c6067367bec9f
This commit is contained in:
committed by
Copybara-Service
parent
3230cf99f9
commit
e6d77650f7
@@ -420,17 +420,11 @@ void mj_mulM2(const mjModel* m, const mjData* d, mjtNum* res, const mjtNum* vec)
|
||||
void mj_addM(const mjModel* m, mjData* d, mjtNum* dst,
|
||||
int* rownnz, int* rowadr, int* colind) {
|
||||
int nv = m->nv;
|
||||
|
||||
// sparse
|
||||
if (rownnz && rowadr && colind) {
|
||||
mj_markStack(d);
|
||||
mjtNum* buf_val = mjSTACKALLOC(d, nv, mjtNum);
|
||||
int* buf_ind = mjSTACKALLOC(d, nv, int);
|
||||
|
||||
mju_addToMatSparse(dst, rownnz, rowadr, colind, nv,
|
||||
d->M, m->M_rownnz, m->M_rowadr, m->M_colind,
|
||||
buf_val, buf_ind);
|
||||
|
||||
mj_freeStack(d);
|
||||
mju_addToMatSparse(dst, rownnz, rowadr, colind, nv, d->M,
|
||||
m->M_rownnz, m->M_rowadr, m->M_colind);
|
||||
}
|
||||
|
||||
// dense
|
||||
|
||||
Reference in New Issue
Block a user