我有一个将R ^ N转换为R ^ M的函数。为简单起见,让我们让它成为身份函数@(z) z
,其中z可以是一个向量。我想将函数应用于大小为K x N
的参数列表,并将其映射到K x M
输出。
这是我的尝试:
function out_matrix = array_fun_matrix(f, vals)
for i=1:size(vals,1)
f_val = f(vals(i,:));
if(size(f_val,1) > 1) %Need to stack up rows, so convert as required.
f_val = f_val';
end
out_matrix(i,:) = f_val;
end
end
您可以尝试
array_fun_matrix(@(z) z(1)^2 + z(2)^2 + z(3), [0 1 0; 1 1 1; 1 2 1; 2 2 2])
问题:使用矢量化等方法有更好,更有效的方法吗?我错过了内置功能吗?
非矢量化函数的例子:有很多,通常涉及复杂的子步骤和数值解。一个简单的例子就像寻找一个方程的数值解,这个方程式使用数值求积。即让params = [b c]
并解析a
以使int_0^a ((z + b)^2) dz = c
(我知道你可以做一些微积分,但这里的积分被剥离了)。实现这个例子,
find_equilibrium = @(param) fzero(@(a) integral(@(x) (x + param(1)).^2 - param(2), 0, a), 1)
array_fun_matrix(find_equilibrium, [0 1; 0 .8])
答案 0 :(得分:1)
您可以使用cellfun
功能,但您需要稍微操控一下数据:
function out_matrix = array_fun_matrix(f, vals)
% Convert your data to a cell array:
cellVals = mat2cell(vals, ones(1,size(vals,1)));
% apply the function:
out_cellArray = cellfun(f, cellVals, 'UniformOutput', false);
% Convert back to matrix:
out_matrix = cell2mat(out_cellArray);
end
如果你不喜欢这个实现,你可以通过预先分配out_matrix来提高你的性能:
function out_matrix = array_fun_matrix(f, vals)
firstOutput = f(vals(1,:));
out_matrix = zeros(size(vals,1), length(firstOutput)); % preallocate for speed.
for i=1:size(vals,1)
f_val = f(vals(i,:));
if(size(f_val,1) > 1) %Need to stack up rows, so convert as required.
f_val = f_val';
end
out_matrix(i,:) = f_val;
end
end