2012-10-09 120 views
6

驗證某個元素值後,是否有方法將元素插入到數組中?例如,採取matlab:元素後插入元素?

A = [0 0 1 1 0 1 0] 

陣列中的每個1之後,我想插入另一個1得到

Anew = [0 0 1 1 1 1 0 1 1 0] 

但是我想辦法對一般情況下編碼本(任意長度1行數組和可能以任何順序)。

回答

2

此代碼是不是最優雅,但它會回答你的問題......

A=[0 0 1 1 0 1 0]; 
AA=[]; 
for ii=1:length(A); 
    AA=[AA A(ii)]; 
    if A(ii) 
     AA=[AA 1]; 
    end 
end 

我敢肯定會有也是量化的方式...

+0

AA的唯一問題是每次迭代都會增加,這會使大矢量的速度變慢。如果您可以預先分配AA,則不存在任何問題,但是這樣的連接不起作用! – Zero

+0

是的,這對大數組並不好,就像我已經說過的那樣,有一種矢量化的方式,並且你展示了一個。我也在考慮有關準確性的問題,但我不確定\沒有經歷過如何使用該功能來做到這一點...... – bla

+0

沒有矢量化,但對讀者來說非常清楚。肯定是一個很好的答案,+1 –

5
A = [0 0 1 1 0 1 1]; 

i = (A == 1); % Test for number you want insert after 
t = cumsum(i);    
idx = [1 (2:numel(A)) + t(1:end-1)]; 

newSize = numel(A) + sum(i); 
N = ones(newSize,1)*5;    % Make this number you want to insert 

N(idx) = A 

輸出:

N = 

    0  0  1  5  1  5  0  1  5  0 

我所做的插入數字5和分裂的事情多行,所以很容易看到發生了什麼事情。

如果你想要做一個循環(這是我會怎麼做它在現實生活中,其中沒有人能看到我炫耀)

A = [0 0 1 1 0 1 0]; 

idx = (A == 1); % Test for number you want insert after 
N = zeros(1, numel(A) + sum(idx)); 
j = 1; 
for i = 1:numel(A) 
    N(j) = A(i); 
    if idx(i) 
     j = j+1; 
     N(j) = 5;  % Test for number you want to insert after 
    end 
    j = j+1; 
end 

N 

輸出:

N =

0  0  1  5  1  5  0  1  5  0 
2

這應該做的伎倆:

>> A = [0 0 1 1 0 1 0] 
>> 
>> sumA = sum(A); 
>> Anew = zeros(1, 2*sumA+sum(~A)); 
>> I = find(A) + (0:sumA-1); 
>> Anew(I) = 1; 
>> Anew(I+1) = 8.2; 

Anew = 
    0 0 1 8.2 1 8.2 0 1 8.2 0