使用MatLab匿名函数生成MxN矩阵

时间:2014-06-27 01:59:13

标签: arrays matlab matrix sum vectorization

想象一下,例如我们有以下功能:

f = @(n) sin((0:1e-3:1) .* n * pi);
g = @(n, t) cos(n .^ 2 * pi ^2 / 2 .* t);
h = @(n) f(n) * g(n, 0);

现在,我希望能够将n的值数组输入h并返回n的每个值的结果总和。

我正在努力提高效率,所以我避免了新手for循环方法,只需填写预先分配的矩阵并对列进行求和。我也尝试使用arrayfun并将单元格转换为矩阵然后对其进行求和,但它最终比for循环更慢。

有谁知道我怎么做?

1 个答案:

答案 0 :(得分:1)

事实上,由于最近版本的MATLAB中JIT编译的改进,“新手”for循环将与任何其他矢量化解决方案一样快速竞争。

% array of values of n
len = 500;
n = rand(len,1);

% preallocate matrix
X = zeros(len,1001);

% fill rows
for i=1:len
    X(i,:) = h(n(i));    % call function handle
end
out = sum(X,1);

上述速度(甚至更快):

XX = cell2mat(arrayfun(h, n, 'UniformOutput',false));
out = sum(XX,1);

编辑:

这里它是在单个向量化调用中没有函数句柄的情况下直接计算的:

n = rand(len,1);

t = 0;  % or any other value
out = sum(bsxfun(@times, ...
    sin(bsxfun(@times, n, (0:1e-3:1)*pi)), ...
    cos(n.^2 * t * pi^2/2)), 1);