[Rd] Proposal for diagonal-only chol2inv option
Adam marstrand
@d@mboegh @end|ng |rom gm@||@com
Sat Sep 19 22:14:37 CEST 2026
Thank you for the positive response! I have created a Bugzilla report with
the (now correctly indented) minimal patch, a small regression test and
documentation.
Best,
Adam
Den lør. 19. sep. 2026 kl. 18.04 skrev Martin Maechler <
maechler using stat.math.ethz.ch>:
> >>>>> J C Nash
> >>>>> on Fri, 18 Sep 2026 10:22:48 -0400 writes:
>
> > I suspect (though am open to correction) that specialized
> > patches like this add work for R-core to maintain without
> > providing enough general benefit to make that of value.
>
> > On the other hand, I believe is extremely worthwhile to
> > document how such speedups are obtained, and to provide
> > the resulting improved code, perhaps as a small package or
> > study in something like Github. Therefore I urge you to
> > write up what you do, and further to try to obtain
> > comparison results on different systems to ensure results
> > are portable. I'll offer, on an "as able to do so" basis
> > to run some tests on Linux systems if you do something
> > along this line.
>
> > While my experiences doing such specializations are now
> > almost a decade old, I'll suggest that it is worth finding
> > what "pieces" are best pushed into Fortran or other
> > compiled or similarly fast code. I've been surprised on
> > occasions. Moreover, sometimes quite small chunks are the
> > key to efficiency.
>
> > Best wishes for success,
> > John Nash
>
> Thank you, Adam and John.
>
> Indeed, Adam's proposal already uses fast C, calling BLAS etc.
>
> John is right that we R-core are often reluctant to accept
> "border line" useful code to be added to the base source code,
> as indeed we (and our successors in the future) will have to
> keep maintaining it.
>
> Adam's proposed changes seem not very large;
> (and if they were properly indented they would be considerably
> more readable !)
>
> As maintainer of the Matrix package, I'm sympathetic
> to ideas of nice algorithmic improvements of relatively common(*)
> matrix operations, as this one.
>
> *) I found 'diag(chol2inv(' in 36 files in CRAN packages (via
> GH search language:r org:cran)
>
> In that sense, I recommend Adam to go ahead and ask for an R
> Bugzilla account wih which he then could open a "WISHLIST"
> issue, and provide a (minimal!) patch, as well.
>
> Martin
>
>
> > On 2026-09-18 10:03, Adam marstrand wrote:
> >> Dear R-devel,
> >>
> >> I have a use-case where diag(chol2inv(U)) is required for many
> millions of
> >> dense Cholesky factors. Currently, chol2inv() calls Lapack's
> DPOTRI, which
> >> forms the complete inverse although only the diagonal may be needed.
> >>
> >> After DTRTRI("U", "N", ...), each diagonal element of the inverse
> is the
> >> squared 2-norm of one row of the inverted upper-triangular factor
> and can
> >> therefore be obtained simply through using BLAS DDOT. This makes
> the work
> >> after the triangular inversion quadratic instead of running the
> full DLAUUM
> >> product.
> >>
> >> It should be rather simple to implement, for example as chol2inv(x,
> size =
> >> NCOL(x), diag.only = FALSE), with the relevant part of La_chol2inv()
> >> becoming approximately:
> >> if (only_diag) {
> >> F77_CALL(dtrtri)("U", "N", &sz, REAL(ans), &sz, &info
> >> FCONE FCONE);
> >> } else{
> >> F77_CALL(dpotri("U", &sz, REAL(ans), &sz. &info FCONE);
> >> }
> >>
> >> if (only_diag) {
> >> SEXP d = PROTECT(allocVector(REALSXP, sz)); nprot++;
> >> BLAS_INT inc = (BLAS_INT) sz;
> >> for (int i = 0; i < sz; i++) {
> >> BLAS_INT len = (BLAS_INT) (sz - i);
> >> double *x = REAL(ans) + i + SZ * i;
> >> REAL(d)[i] = F77_CALL(ddot)(&len, x, &inc, x, &inc);
> >> }
> >> ans = d;
> >> } else {
> >> for (int j = 0; j < sz; j++)
> >> for (int i = j + 1; i < sz; i++)
> >> REAL(ans)[i + j * SZ] = REAL(ans)[j + i * SZ];
> >> }
> >>
> >> On my computer (current R-devel build/Windows/LAPACK 3.12.1), this
> cut the
> >> duration of the operation almost in half (~1.8x faster) in my
> application
> >> and in some quick benchmarking. It returns identical results to
> >> diag(chol2inv(U)) from my testing.
> >>
> >> Would such an option be of interest? I would be happy to provide a
> small
> >> patch + test.
> >>
> >> Best,
> >> Adam Bøgh Marstrand-Jørgensen
>
[[alternative HTML version deleted]]
More information about the R-devel
mailing list