【问题标题】:Insert new values in to array在数组中插入新值
【发布时间】:2018-12-02 01:49:01
【问题描述】:

在 Matlab 中,我有一个带有标签的数组,例如

Events = [10; 11; 41; 42; 31; 32; 41; 42]; 

我想编辑这个数组,以便在每个 41 之后插入 8 个 411s,这样我最终得到:

New_events = [10; 11; 41; 411; 411; 411; 411; 411; 411; 411; 411; 42; 31; 
              32; 41; 411; 411; 411; 411; 411; 411; 411; 411; 42];

有没有简单的方法来做到这一点?

我使用find 来获取41 每次出现的索引,但我不确定如何保留其他标签的顺序...有谁知道我该怎么做?

我刚刚发布了一个数组外观的小示例,但实际上,它要大得多,我需要这样做很多次(大约 200 次),所以我需要一些自动化的东西......

谢谢

【问题讨论】:

    标签: arrays matlab for-loop reindex


    【解决方案1】:

    您可以通过为每个插入点 (Events==41) 创建一个布尔值然后使用 repmat 重复 411 8 或 0 次来做到这一点。

    然后arrayfun 使代码很短

    Events = [10; 11; 41; 42; 31; 32; 41; 42];
    out = arrayfun( @(x,b) [x; repmat(411, 8*b, 1)], Events, Events == 41, 'uni', 0 );
    out = vertcat(out{:});
    

    【讨论】:

    • 谢谢!最后,我意识到我拥有的数组是一个带有字符的单元格。我修改了您的代码以使用 strcmp 将“41”与事件进行比较。它有效,但唯一的问题是,不是每次在新单元格中添加“411”,而是在一个单元格中包含 8 个“411”......有什么办法可以克服这个问题吗?
    • 您应该使用 repmat( {'text'}, 8*b, 1) 从一个字符串创建一个 8 元素元胞数组。如果您有一个单元格而不是数组,您可能还需要使用cellfun
    • 嗨 Wolfie,继这个问题之后,我在这里发布了另一个问题:你能帮忙吗? stackoverflow.com/questions/51009288/…
    【解决方案2】:

    找出所有 41 个,然后遍历它们。只是,每次插入后,将 8 添加到下一个索引 41:

    finds_41 = find(Events == 41).';
    counter = 0;
    for idx = finds_41
        pos_41 = idx + counter*8
        Events = [Events(1:pos_41); 411 * ones(8,1); Events((pos_41 + 1):end)];
        counter = counter + 1;
    end
    

    【讨论】:

    • 感谢您的回答,但这只会将 411 添加到它找到的前 41 个中,其余的保持原样
    • @MaheenSiddiqui 已更正。再试一次。
    • @OmG:它看起来比我的版本好很多!我希望这是可能的。但是,当我将它们与 Events = randi(100,[1E6,1]); 进行比较时,它的速度要慢 2200 倍。可能是因为你一直在复制 events 变量。
    【解决方案3】:

    这可能有效。但我有点希望有一个更简单的解决方案来解决这个问题。你想做的事情看起来很简单。

    clear all
    Events = [10; 11; 41; 42; 31; 32; 41; 42];
    Insert = [411; 411; 411; 411; 411; 411; 411; 411];
    atval = 41;
    
    Nin=numel(Insert);
    idx = [0;find(Events==atval)];
    out = nan(length(Events)+Nin*(length(idx)-1),1);
    for ct = 2:length(idx)
        out(Nin*(ct-2)+[1+idx(ct-1):idx(ct)])=Events(1+idx(ct-1):idx(ct)); %copy events
        out(Nin*(ct-2)+idx(ct)+1:Nin*(ct-2)+idx(ct)+Nin)=Insert; %put insert
    end
    out(Nin*(ct-1)+[1+idx(ct):length(Events)])=Events(1+idx(ct):end); %copy last events
    

    【讨论】:

    • 谢谢!这行得通...我只是想确保我了解每个步骤在做什么
    • 不客气。我对它的速度感到惊讶。如果您将Events = [...] 替换为Events = randi(100,[1E6,1]);,它仍然可以在我的PC 上运行25 毫秒。
    • 谢谢...我还有一个问题...如果 events 是一个字符数组,我将如何修改它?我可以使用 strcmp 来比较 atval 吗?
    • 您也可以将字符数组与单个字符进行比较。 find('abcde'=='d')
    猜你喜欢
    • 1970-01-01
    • 2016-11-05
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2015-04-09
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多