我必须解决许多独立的约束线性最小二乘问题(包括边界和约束)。所以我在循环中多次这样做。对于每个问题,我正在寻找x,即min || Cx-d ||并且x是有界的(在0,1中),并且所有x个元素必须总和为1.
我正在寻找一种快速实现的方法,因为虽然每次优化都不需要很多时间,但我需要将它包含在一个大循环中。
例如,我的Matlab实现看起来像这样:
img = imread('test.tif');
C = randi(255,6,4);
x=zeros(size(C,2),1);
tp = zeros(size(C,2),1);
Aeq = ones(1,size(C,2));
beq = 1;
options = optimset('LargeScale','off','Display','off');
A = (-1).*eye(size(C,2));
b = zeros(1,size(C,2));
result = zeros(size(img,1),size(img,2),size(C,2));
for i=1:size(img,1)
for j=1:size(img,2)
for k=1:size(img,3)
tp(k) = img(i,j,k);
end
x = lsqlin(C,tp,A,b,Aeq,beq,[],[],[],options);
for l=1:size(C,2)
result(i,j,l)=x(l);
end
end
end
对于500x500循环,大约需要5分钟。但我的循环比这要大得多。任何想法都是受欢迎的,但我更喜欢Matlab,Python或R解决方案。
答案 0 :(得分:0)
正如评论中所提到的:所使用的命令经过了高度优化,而且切换语言不会产生太大的影响。
首先回到你想要实现的目标,也许是为了实现你不需要解决这么多难题。
如果您得出结论,您确实想要进行这种精确计算,请考虑更改设置,并使用算法。
从doc lsqlin
开始,确定速度的两个主要参数是:
如果所有这些都没有帮助,请考虑一些技巧: