MATLAB中批量评估单变量函数g时维度不匹配问题的解决方法
批量评估仅支持标量输入的Matlab函数g的解决方案
问题背景
我们定义了两个Matlab匿名函数:
f = @(x)( x + [x(1); 0])
f接受列向量作为输入;接着定义调用f的函数g:
g = @(x)(f([x;0]))
g仅支持标量输入,直接执行g(0:2)会抛出Dimensions of arrays being concatenated are not consistent错误,我们需要批量得到[g(0), g(1), g(2)]形式的结果。
解决方案
1. 使用arrayfun函数(推荐)
这是Matlab中处理标量函数批量计算的标准方式,它会对输入数组的每个元素单独调用目标函数:
result = arrayfun(g, 0:2)
如果g的输出是向量而非标量,可以添加'UniformOutput', false参数,再通过拼接得到矩阵:
result_cell = arrayfun(g, 0:2, 'UniformOutput', false); result = [result_cell{:}]
2. 改写g使其原生支持向量输入
如果需要频繁批量调用,可以修改g的定义,让它直接兼容向量输入:
g = @(x) arrayfun(@(scalar_x) f([scalar_x; 0]), x);
或者基于原函数的运算逻辑,直接适配向量运算:
% 推导:原g输入标量x时,f([x;0]) = [x;0] + [x;0] = [2x; 0] % 适配向量输入后,直接生成对应矩阵 g = @(x) [2*x; zeros(size(x))];
修改后即可直接执行g(0:2)得到预期结果。
3. 手动循环遍历输入
如果偏好显式逻辑,可以通过循环逐个计算并收集结果:
inputs = 0:2; % 预分配内存,假设g的输出为2行1列向量 result = zeros(2, length(inputs)); for idx = 1:length(inputs) result(:, idx) = g(inputs(idx)); end
内容的提问来源于stack exchange,提问作者mathslover
相关产品推荐
相关产品推荐

