【问题标题】:What is the canonical way to integrating an array over another将数组集成到另一个数组的规范方法是什么
【发布时间】:2021-05-29 03:39:59
【问题描述】:

考虑两个数组:

x = [0 .05 .1 .3 .32 .4 .55 .7 1 1.3 1.4 1.45 1.6 1.8 1.9 2 2.2 2.3 2.6 2.8 2.91 3];
y = x.^2;

我想将y 整合到x 之上。到目前为止,我发现我可以在 for 循环中使用 trapz() 函数:

y1 = zeros(length(x));

for ii = 1:length(x)
    y1(ii) = trapz(x(1:ii), y(1:ii));
end

plot(x, y1, x, y);

但是,我想知道是否有一种规范的方法可以在不使用 for 循环的情况下做到这一点。

P.S.1. 我想 MATLAB/Octave 是矢量化函数,应该有预定义的函数来处理这类事情。

P.S.2.我现在没有 MATLAB 许可证,但答案必须与 MATLAB 和 Octave 兼容。

【问题讨论】:

    标签: matlab octave octave-gui


    【解决方案1】:

    听起来你想要cumtrapz( ) function

    y1 = zeros(length(x), 1);
    
    y1 = cumtrapz(x, y)
    plot(x, y1, x, y);
    

    【讨论】:

    • 它只是用于均匀间隔的数据。
    • 不需要使用y1 = zeros(length(x), 1);,因为你在下一行把它扔掉了。见"Ineffective Preallocation"
    • @Foad cumtrapz 也适用于非均匀间距。示例:x = linspace(0,3,1e4).^2; cumtrapz(x, exp(-x.^2/2)/sqrt(2*pi))
    【解决方案2】:

    您可以使用cumsumdiff

    y1 = [0 cumsum((y(1:end-1) + diff(y)/2) .* diff(x))];
    

    【讨论】:

      猜你喜欢
      • 2017-05-25
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      相关资源
      最近更新 更多