Octave如何定义可接收向量输入的匿名函数
问题原因
你定义的可接收向量的匿名函数本身没有任何问题,运行不符合预期的核心原因是arrayfun的默认遍历规则:arrayfun默认逐单个元素遍历传入的数组,按列优先顺序把每个标量值传给函数句柄,不会自动按行/列拆分出子向量传入。
你之前可运行的写法,本质是把矩阵的每一列单独作为输入传给arrayfun,让它同步取多个输入同位置的标量拼成向量,这种写法一旦矩阵列数变化就要手动增减函数入参,扩展性很差。
无需逐元素指定参数的实现方案
两种方案都不需要显式编写for循环,且支持任意列数的输入矩阵:
方案1:按行拆分矩阵为cell数组,配合cellfun遍历
先把原矩阵按行拆分为独立cell单元,每个单元存储一行的向量,直接用你原本写的接收向量的匿名函数即可:
% 按行拆分Data:每行对应1个cell,列数和原矩阵一致 row_cells = mat2cell(Data, ones(1, size(Data, 1)), size(Data, 2)); % 原匿名函数无需任何修改 vec_func = @(vec) some_func(vec, bla, bla); % 用cellfun遍历即可,若some_func返回值非标量,加'UniformOutput',false参数 output = cellfun(vec_func, row_cells);
方案2:遍历行索引,匿名函数内取对应行
不需要做矩阵格式转换,直接遍历行索引,在匿名函数内部索引出整行向量传入目标函数,写法更简洁:
% 匿名函数入参为行号,内部直接取对应整行数据 vec_func = @(row_id) some_func(Data(row_id, :), bla, bla); % 传入行号序列遍历,返回非标量时同样加'UniformOutput',false参数 output = arrayfun(vec_func, 1:size(Data, 1));
内容的提问来源于stack exchange,提问作者broccolee
相关产品推荐
相关产品推荐

