This is a "vectorized" version of lsqnonneg to speed-up solving multiple non-negative least square fits of independent data vectors to a common base of model vectors. The function is based on Matlab's lsqnonneg function. I adapted the code to allow for multiple (column) data vectors and vectorized everything I could to speed-up processing.
This was developped in the context of fitting pixel intensitiy (a positive value) of every pixel in a time series of fluorescence images (N voxels, T images) to reference fluorescence time-activity curves.
The speed-up factor will vary depending on the data size, but the syntax is more compact, as shown below.
% Example : 10000 vectors of 100 time points that need to be fitted with non-negative least squares to 5 model curves
nTimePts = 100;
nDataVect = 10000;
nModels = 5;
% Data matrix
d = rand(nTimePts, nDataVect);
% Reference (model) curves
C = rand(nTimePts, nModels);
% Non-negative least-square fit
X = lsqnonnegvect(C,d);
% Instead of :
% X = zeros(nModels,nDataVect);
% for k = 1:nDataVect
% X(:,k) = lsqnonneg(C,d(:,k));
David Provencher (2020). lsqnonnegvect.m (https://www.mathworks.com/matlabcentral/fileexchange/47476-lsqnonnegvect-m), MATLAB Central File Exchange. Retrieved .
Fantastic function, with huge speedup. Thanks very much for sharing!
Thansks for sharing. It works!! (Negligible numerical errors occur when using "isequal" to test.)
This is a great way to speed up non-negatively-constrained linear unmixing of spectral images - thanks!
Version 1.1 : Fixed a rare bug that could cause a crash.