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

Arrays 用MatLab匿名函数生成MxN矩阵,arrays,matlab,matrix,sum,vectorization,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 loop方法,即填写一个预先分配的矩阵并对列求和。我还尝试使用arrayfun并将单元格转换为矩阵,然后求和,但结果比for循环慢 有人知道我是如何做到这一点的吗?

例如,假设我们有以下功能:

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 loop方法,即填写一个预先分配的矩阵并对列求和。我还尝试使用
arrayfun
并将单元格转换为矩阵,然后求和,但结果比for循环慢

有人知道我是如何做到这一点的吗?

事实上,由于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);
以上速度与(可能更快):


编辑: 在这里,它是在单个向量化调用中不使用函数句柄直接计算的:

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);

我有点不明白你想产生什么?你是说你想要一个
mxn
矩阵,其中每个元素都由该函数操作?您能给出一些示例数据吗?对于数组中
n
的每个值,
h
将生成一个值向量。我相信OP想要计算为
n
的每个值生成的每个向量的总和。此外,如果输出是单个值(在您的情况下就是这样),则无需将矩阵转换为
单元
。我正在尝试使用预先计算的波数值生成无限方阱问题的傅里叶级数结果。理想情况下,我希望使用一个线性函数来生成我指定的所有n的h(n)之和。这可以通过:
F=0(1,长度(0:1e-3:1))
n=一些整数向量
F=F+h(n(i))
end
我同意这里关于JIT的说法+1如果你愿意,这可以简化为:
out=sum(sin(bsxfun(@times,n(:),(0:1e-3:1)*pi))
(请注意,
t
始终为零,因此
g(n,t)
减少为1的向量,这给我们留下了
h(n)=f(n)
)非常感谢。就不是0而言,它也不会总是0,我正在进行时间进化。我只是把它作为占位符放在那里。@sifodas:我也这么认为:)请参阅我的编辑以获得可能的一行
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);