簡體   English   中英

在數組中插入新值

[英]Insert new values in to array

在Matlab中,我有一個帶有標簽的數組,例如

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

我想編輯此數組,以便在每個41之后插入8 411 s,最后得到:

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的索引,但是不確定如何保留其他標簽的順序。有人知道我該怎么做嗎?

我剛剛發布了一個數組的外觀的小例子,但實際上,它要大得多,我需要執行多次(appx 200次),所以我需要自動化的東西...

謝謝

找到所有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{:});

這可能有效。 但是我有點希望有一個解決這個問題的簡單方法。 您想做的事情似乎很簡單。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM