MATLAB fmincon接收的矢量太大

时间:2017-05-04 14:54:30

标签: matlab optimization

我有一个优化函数,它接收一个大的向量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中是不可能的。

2 个答案:

答案 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)

M声明为全局变量,然后与所有内容共享,

global M

Declare variables as global