【问题标题】:Generate MxN Matrix with MatLab Anonymous Function使用 MatLab 匿名函数生成 MxN 矩阵
【发布时间】:2014-06-27 01:59:13
【问题描述】:

假设我们有以下函数:

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 循环更慢。

有人知道我该怎么做吗?

【问题讨论】:

  • 我对您要生成的内容有点困惑?你是说你想要一个M x N 矩阵,其中每个元素都由该函数操作?你能举一些例子数据吗?
  • 对于数组中n 的每个值,h 将生成一个值向量。我相信 OP 想要计算为n 的每个值生成的每个向量的总和。此外,如果输出是单个值(在您的情况下),您不需要将矩阵转换为 cell
  • 我正在尝试使用我预先计算的波数值为无限方井问题生成傅里叶级数的结果。理想情况下,我想要一个单行器来生成我指定的所有 n 的 h(n) 总和。这可以通过以下方式完成:F = zeros(1, length(0:1e-3:1));n = some vector of integers;for i = 1:length(n)F = F + h(n(i));end

标签: arrays matlab matrix sum vectorization


【解决方案1】:

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

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

【讨论】:

  • 我在这里同意 JIT。 +1
  • 如果你愿意,这可以简化为:out = sum(sin(bsxfun(@times, n(:), (0:1e-3:1)*pi)))(注意t 总是零,所以g(n,t) 简化为一个向量,剩下的就是h(n)=f(n)
  • 非常感谢。就 t 为 0 而言,它不会一直为 0,我正在做一个时间演化。我只是把它作为占位符。
  • @Sifodeas:我想了很多 :) 查看我的编辑以了解可能的单线
猜你喜欢
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-09-21
  • 2014-10-22
相关资源
最近更新 更多