MATLAB:如何创建N×1函数句柄,将指定句柄置于随机索引其余为0?
MATLAB:创建含随机位置函数句柄的N×1函数句柄“数组”
问题背景
已知现有MATLAB函数句柄:
f = @(t)f_0.*sin(alpha.*t).*cos(beta.*t);
需要创建名为F的N×1函数句柄“数组”(MATLAB不支持直接创建函数句柄数组),要求将f放置在任意随机索引位置,其余位置元素均为0,N为任意正整数。
例如N=3时,合法实现形式包括:
F = @(t) [f(t); 0; 0]
F = @(t) [0; 0; f(t)]
F = @(t) [0; f(t); 0]
最优实现方案
方法1:稀疏矩阵高效实现(性能优先)
这是大N场景下的最优方案,内存占用更低、运行更快:
% 生成1~N之间的随机索引 idx = randi(N); % 构造函数句柄F F = @(t) zeros(N,1) + sparse(idx, 1, f(t), N, 1);
方法2:数组遍历实现(可读性优先)
如果更看重代码逻辑的直观性,可采用此方案:
idx = randi(N); % 先构造返回cell数组的函数句柄,再转成数值数组 F = @(t) cell2mat(arrayfun(@(k) k == idx ? f(t) : 0, 1:N, 'UniformOutput', false));
方案说明
- 随机索引生成:
randi(N)直接生成1到N范围内的随机整数,确定f(t)的放置位置。 - 稀疏矩阵方案:
- 先创建全零的N×1数组,再通过
sparse(idx,1,f(t),N,1)生成仅在指定位置有值的稀疏矩阵,两者相加得到目标数组; - 稀疏矩阵仅存储非零元素,内存占用远低于全量数组,大N场景下效率优势明显。
- 先创建全零的N×1数组,再通过
- 数组遍历方案:
arrayfun遍历1到N的每个位置,判断当前位置是否等于随机索引,是则返回f(t),否则返回0;- 由于
arrayfun默认返回cell数组,需用cell2mat转换为N×1的数值数组,逻辑直观易理解。
验证示例
当N=5且随机索引idx=3时,调用F(t)会返回如下N×1数组:
0 0 f(t) 0 0
内容的提问来源于stack exchange,提问作者Jonathan Frutschy
相关产品推荐
相关产品推荐

