将新值插入数组

Insert new values in to array

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

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

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

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 次)所以我需要一些自动化的东西...

谢谢

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

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

找到所有 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

您可以为每个插入点 (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{:});