【问题标题】:Push_back element in Matlab StructMatlab Struct 中的 Push_back 元素
【发布时间】:2013-08-13 11:53:06
【问题描述】:

Matlab 中,我有一个简单的结构,我想构建一个这种结构的数组(我知道怎么做)。我的问题:有没有一种方法可以简单地将一个元素插入到该数组中而不必告诉该数组应该在 位置 中?在 Matlab 语言中是否存在类似于 c++ 中的 "push_back" 函数的东西,它只是将您的元素放在向量的末尾?

【问题讨论】:

    标签: arrays matlab struct


    【解决方案1】:

    您可以将索引与end结合使用

    a_struct = struct('x', 1);
    a_struct(end+1) = struct('x', 2); % this writes the element to the `end+1`'th-position
    disp(a_struct)
    

    会给你:

    1x2 struct array with fields:
        x
    

    但请注意,在底层没有任何预分配,因为可能存在用于 c++ 向量等的预分配。 因此,对end+1 的每一次赋值都会在内部生成一个带有一个附加元素的旧结构的副本。 参见例如http://blogs.mathworks.com/loren/2008/02/01/structure-initialization/#7 用于 cmets。

    【讨论】:

    • “因此,对 end+1 的每个赋值都会在内部生成一个带有一个附加元素的旧结构的副本。”这不再是真的。请参阅here 以获得证明。
    【解决方案2】:

    听起来你想迭代地扩展数组(向量)。这在 MATLAB 中是非常低效的,因为随着向量的增长,它会导致大量的重新分配。

    在MATLAB中,最好提前分配向量(大小正确)并直接索引,或者使用arrayfun构造数组。

    这与std::vector 中的问题完全相同,与push_back() 相比,分配一次然后使用std::back_inserter 更好。

    【讨论】:

    • 好的,但我不知道矢量大小。但是想象一下已经预先分配,是否有一种简单而干净的方法可以将另一个元素(在 end/front ,我真的不在乎)插入到该向量中?
    • foo(end+1)=bar; 应该可以解决问题。但请注意,随着向量大小的变化,这会导致重新分配。如果你想分配一次,你必须知道正确的大小并使用1:end之间的索引。
    • 你能不能给我一个简单的例子来说明如何使用“foo”,我真的不明白它的意思。谢谢
    猜你喜欢
    • 2014-10-19
    • 2020-04-03
    • 2016-01-24
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2016-03-31
    • 1970-01-01
    相关资源
    最近更新 更多