在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
的索引,但是不确定如何保留其他标签的顺序。有人知道我该怎么做吗? >
我刚刚发布了数组外观的一个小例子,但实际上,它要大得多,我需要做很多次(appx 200次),所以我需要自动化的东西...
谢谢
答案 0 :(得分:1)
找到所有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
答案 1 :(得分:1)
为此,您可以为每个插入点(repmat
创建一个布尔值,然后使用411
重复arrayfun
8次或0次。
然后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{:});
使代码很短
html.actionlink(text, action, controller, reoute values, htmlattributes)
答案 2 :(得分:0)
这可能有效。但是我有点希望有一个解决这个问题的简单方法。您想做的事情似乎很简单。
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