2

我必须解决许多独立的约束线性最小二乘问题(有边界和约束)。所以我在循环中多次这样做。对于每个问题,我正在寻找的 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 解决方案。

4

1 回答 1

1

正如评论中提到的:使用的命令是高度优化的,切换语言不会有什么不同。

首先回到你想要达到的目标,也许是为了达到你不需要解决这么多难题的目标。

如果您得出的结论是您确实想要进行此精确计算,请考虑更改设置并尝试使用该算法。

doc lsqlin它看来,决定速度的两个主要参数是:

  • 迭代次数
  • 可接受的公差

如果所有这些事情都没有足够的帮助,请考虑一些技巧,例如:

  • 只解决足够不同的问题
  • 用更简单的约束求解,并对结果进行四舍五入
于 2014-05-12T14:07:25.010 回答