将arrayfun应用于矩阵的有效方法(即R ^ N到R ^ M)

时间:2014-09-10 19:03:19

标签: matlab

我有一个将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])

1 个答案:

答案 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