【问题标题】:Loop through data to integrate in blocks: MATLAB循环数据以集成到块中:MATLAB
【发布时间】:2017-08-31 10:37:46
【问题描述】:

我目前正在尝试在 Matlab/Octave 中实现一个循环,其中读取来自文件的数据,存储在一个数组中,然后以 1600 个点为一组进行集成(每个数据点的间隔为 10 ns)。 我了解我需要做的事情的逻辑,但无法编写代码。任何帮助将不胜感激。

trace_int = zeros(320000,1);
trace_c = zeros(200,1);
trace = dlmread('trace_all.dat',' ',[0,0,320000,1]);
while i = 1:200
    trace_i(i,:) = trace(1+1599*(i-1):1:1600*(i));
    trace_c(i,:) = trapz(trace_i(i));
end

这就是数据的样子

20 1484  
30 1484  
40 1483  
50 1484  
60 1484  
70 1484  
80 1483  
90 1483 

【问题讨论】:

    标签: matlab loops octave


    【解决方案1】:

    不需要循环:

    % create sample data
    trace = [20 1484; 30 1454; 40 1493; 50 1414; 60 1404; 70 1494; 80 1473; 90 483];
    
    n = 4; % this would be 1600 in your case
    trace_c = trapz (reshape (trace (:, 2), n, []))
    

    返回:

    trace_c =
        4396.0   3910.5
    

    【讨论】:

    • 轻轻一碰就能打败我!请注意,您没有考虑集成中的 X 数据(OP 也不公平),但由于它是恒定间隔,我们可以在最后除以 dx
    • @Wolfie 既然他说空间是恒定的 10ns...感谢编辑,我总是忘记 MATLAB 无法处理 # 作为注释
    • 是的,简化了事情。不用担心,当我处于完全 VB 模式时,我经常错误地使用'
    • 抱歉,当我输入此代码时,它返回以下错误 - “错误:重塑:SIZE 不能被已知尺寸的乘积 (= 1600) 整除”。问题是我的数据是连续的,下一个脉冲也是从 0 开始到 16000 结束。大约有十亿个这样的脉冲。
    • 您的数据不是 1600 的倍数。例如,如果上面示例中的 n=5 将不起作用。你可以分解你的数据,然后整合其余的:lastOfBatch = n*floor(size(trace,1)/n);[trapz(reshape(trace(1:lastOfBatch, 2), n, [])),trapz(reshape(trace(lastOfBatch+1:end,2),rem(size(trace,1),n),[]))]
    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2015-10-21
    相关资源
    最近更新 更多