【问题标题】:Fastest/Easiest way to store multiple arrays of data for multiple time steps为多个时间步存储多个数据数组的最快/最简单的方法
【发布时间】:2013-07-20 20:08:03
【问题描述】:

我有数千个时间步长的粒子 ID、x 位置、y 位置、x 速度和 y 速度数据。我希望能够跨多个时间步使用find()。例如查找 x 和 y 速度低于某个值的所有时间和粒子。

我从一组矩阵开始:

particles{t}(particleIndex,dataType)

所以particles{40}(:,2) 会给我所有粒子在时间步 40 的 y 位置 particles{50}(:,1) 将在时间步 50 返回所有粒子的 x 位置。

这似乎是一种处理我的数据的笨拙方法。我意识到我可以使用particles(t).idparticles(t).xpos 等结构的数组。我仍然难以跨时间步使用find(),并且无法找到任何信息来为我指明正确的方向。从我读到的内容看来,这也可能不是最好的选择。

出于我的目的,我应该如何存储这些数据,我是否可以跨时间步使用 find() 而无需遍历它们?

【问题讨论】:

    标签: arrays matlab structure


    【解决方案1】:

    为什么不通过粒子 id 索引?:

    particles = struct;
    particles(id).t    % length(t)-by-1
    particles(id).x    % length(t)-by-1
    particles(id).y    % length(t)-by-1
    particles(id).xdot % length(t)-by-1
    particles(id).ydot % length(t)-by-1
    

    那么particles(id).x是一个向量,其中每个元素对应particles(id).t中的一个元素。 particles(1).x(1) 将是 id 1 的第一个 x 值。但是,使用 id 分解事物的问题是您将无法跨粒子搜索。我真的只是使用数组(或包含所有粒子数组的结构):

    particles = struct;
    particles.ids  % 1-by-length(ids)
    particles.t    % length(t)-by-1 or length(t)-by-length(ids)
    particles.x    % length(t)-by-length(ids)
    particles.y    % length(t)-by-length(ids)
    particles.xdot % length(t)-by-length(ids)
    particles.ydot % length(t)-by-length(ids)
    

    这里的particles.ids 可以是行(或其他数组的列)的索引。当然,在这种情况下,我们所有的粒子轨迹都需要具有相同的长度(时间步数)。这类似于Matlab的ODE函数的结构输出形式,例如ode45

    【讨论】:

    • 另外,find 通常是不需要的。我建议了解logical indexing,例如xthresh = particles.x(particles.x > 1)
    • 您的第一个解决方案将使跨时间的搜索更容易,这比我在粒子中搜索的频率要高得多。我总是可以为此迭代。
    • 第一个解决方案也很容易允许不同长度的向量。需要在第二个版本中使用元胞数组来处理。
    • 我不太确定您的第二个解决方案将如何处理我的数据。每个粒子的 ID 都是唯一的,每个 t 都有一个 x、y、xdot 和 ydot。我的数据格式为 x、y、粒子 ID,t 来自我一直在使用的粒子跟踪库。从那里我将每个时间步的数据分成一个矩阵(或结构)。你是说particles.ids 会保存每个particles.xparticles.y 等的索引吗?
    • 是的。要获得粒子 id 1 的所有x 值,可以使用particles.x(:,particles.ids(1))。当然particles.ids(1) 只是返回1 所以这相当于particles.x(:,1) - 这完全是多余的。我自己不会包含它,但我添加它是因为您之前有一个 id 字段。而且,您没有说,也许您的粒子 ID 没有作为索引编号?还有其他一些配置可能不那么简单,但仍然很有用。
    猜你喜欢
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 2020-11-03
    • 1970-01-01
    • 2011-11-24
    • 2013-01-18
    • 1970-01-01
    相关资源
    最近更新 更多