MATLAB优化:如何高效用匿名函数实现y(idx)=x赋值
MATLAB优化场景中高效构造目标向量的匿名函数方案
需求说明
在MATLAB优化场景中,需将匿名函数传入优化函数。待最小化函数以x为优化变量,需构造N维零向量y:仅在指定索引idx的位置赋值为x。由于匿名函数不支持直接赋值操作,现有实现效率偏低,需更高效的方案。
基础逻辑示例
常规赋值逻辑的代码示例:
N = 100; idx = [2 7 9]'; x = rand(size(idx)); y = zeros(N,1); y(idx) = x;
现有低效实现
当前采用arrayfun逐元素判断赋值,效率较低:
iif = @(varargin) varargin{2 * find([varargin{1:2:end}], 1, 'first')}(); y = arrayfun(@(k) iif(ismember(k,idx),x(idx==k),true,0),0:N-1)';
该实现通过逐元素遍历、多次查找匹配完成赋值,当N较大时,时间复杂度会显著上升。
高效匿名函数实现
方案1:利用匿名函数内的临时变量构造
通过在匿名函数内构造临时变量并完成索引赋值,利用MATLAB向量化操作提升效率:
% 确保N和idx在匿名函数定义的工作区中可见 y_fun = @(x) (z = zeros(N,1); z(idx) = x; z);
方案2:稀疏矩阵转全矩阵构造
借助稀疏矩阵的快速构造特性,效率更优(尤其当N远大于idx长度时):
y_fun = @(x) full(sparse(idx, ones(size(idx)), x, N, 1));
效率说明
两种高效方案均采用向量化操作,时间复杂度为O(M)(M为idx的长度),而非原实现的O(N)。当N远大于M时,速度提升效果极为明显,更适合大规模优化场景。
内容的提问来源于stack exchange,提问作者pheon
相关产品推荐
相关产品推荐

