Цикл for
не обязательно является причиной какой-либо медлительности - вы не предварительно выделяете и lsqlin
, вероятно, распечатывает много вещей на каждой итерации. Тем не менее, вы можете ускорить это, повернув свою матрицу C
в разреженную диагональную матрицу блока, C2
, с n
идентичными блоками (see here). Это решает все проблемы n
за один раз. Если новый C2
не разрежен, вы можете использовать намного больше памяти, и вычисление может занять гораздо больше времени, чем при использовании цикла for
.
n = size(b,2);
C2 = kron(speye(n),C);
b2 = b(:);
lb2 = repmat(lb,n,1); % or zeros(7*n,1);
ub2 = repmat(ub,n,1); % or ones(7*n,1);
opts = optimoptions(@lsqlin,'Algorithm','interior-point','Display','off');
x = lsqlin(C2,b2,[],[],[],[],lb2,ub2,[],opts);
Использование optimoptions
, Я specified the algorithm и установить 'Display'
к 'off'
, чтобы убедиться, что любые выходы и предупреждения не замедляют расчеты.
На моей машине это в 6-10 раз быстрее, чем при использовании петли for
(с правильными параметрами предварительной настройки и настройки). Этот подход предполагает, что малая C2
матрица с элементами m*n*7
может поместиться в память. Если нет, то будет использоваться только подход на основе петли for
(кроме написания вашей собственной специализированной версии lsqlin
или использования любых других проблем, связанных с проблемой).
Вы всегда можете попробовать переключиться по умолчанию. Попробуйте '' '' inner-point'''. Не уверен, для чего этот цикл, и как вы ожидаете от нас работы. – sascha
Я пробовал разные решатели, но проблема такая же. Я использую цикл for, потому что если я попытаюсь дать 'x = lsqlin (C, b, [], [], [], [], lb, ub);' Я получаю 'Внутренние размеры матрицы должны совпадать .' ошибка. С другой стороны, если я использую 'pinv (C) * b' или' C \ b', он работает как шарм, но для 'lsqlin' мне нужно сделать это через цикл' for', и поскольку мне нужны ограничения Мне нужно использовать 'lsqlin'. Поэтому я просто спрашиваю, есть ли возможность оптимизировать или отменить цикл 'for'. – ThT