我有一个优化函数,它接收一个大的向量x
(比如说大小为50,000)的参数。我的优化策略包括将向量x
复制到M
的对角线,然后使用M
进行一些非常快速的操作。
这是电话:
[T, residual] = fmincon(@fun, init_x_params, [], [], [], [], [], [], @confuneq, options2);
我意识到我的优化函数fun
的瓶颈实际上是向量x
的副本到M
的对角线,而不是我之后用{{1}做的实际操作}}。请注意,我使用索引M
的向量进行逻辑索引以智能方式更新对角线,我相信它不能更快地完成。
这是优化函数,它位于main函数的范围内,因此可以访问indices
。
M
我尝试通过将整个function final_error = fun(x)
% Updates M, this is the bottleneck!!
M(indices) = x(:);
% DO STUFF WITH M, it's fast!
end
作为要优化的向量来解决瓶颈,但当然问题是我无法传递整个矩阵M
,因为它是太大了(传递所有矩阵并没有意义,因为我只更新对角线)。
有没有办法直接将M的对角线传递给优化函数?或以某种方式传递整个M
,但以某种方式指定我只想最小化其对角线?理想情况下,我想要使用像“'引用”这样的内容。以M
的对角线作为优化的向量,但我认为这在MATLAB中是不可能的。
答案 0 :(得分:0)
我找到的最快方法如下:
%Generate an Identity vector of the same size as M (I hope M is a square matrix). You can define it earlier if it is being used multiple times.
ident_M = logical(eye(size(M, 1)));
%Change diagonal elements using logical indexing
M(ident_M) = x;
对于10000 x 10000矩阵,我花了大约0.11秒
答案 1 :(得分:-3)