2012-10-09 24 views
6

Belirli bir öğe değerini doğruladıktan sonra bir diziye bir eleman yerleştirmenin bir yolu var mı? Örneğin, dizideki her biri 1 sonramatlab: Öğe sonrası eleman ekleme?

A = [0 0 1 1 0 1 0] 

alır, ben bir yolu, genel durum için, bu kod istediğiniz Ancak

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

almak için başka bir 1 eklemek istediğiniz (herhangi bir uzunluğu 1 satır dizi ve herhangi bir sırada olabilir).

cevap

2

Bu kod en şık değil, ama sorunuzu ...

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 

Ben de bir vektörleşen yolu var olacaktır eminim ... cevap verecek

+0

Bunun tek sorunu, AA'nın büyük vektörler için çok yavaş yapmasını sağlayacak şekilde her yinelemeyi büyütmesidir. Eğer AA’yı önceden tahsis edebilecek olursanız sorun olmaz, ancak birleştirme çalışmaz! – Zero

+0

Evet, büyük diziler için iyi bir şey değil, zaten söylediğim gibi, vektörize edilmiş bir yol var ve siz de bir tane gösterdiniz. Akümülatör hakkında da düşünüyordum, ama emin değilim ki, bu fonksiyonla nasıl yapılacağını bilmiyorum ... – bla

+0

Okunuculuk için değil, vektör için çok açık. Kesinlikle iyi bir cevap, +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 

Çıktı: o ne olup bittiğini görmek kolaydır böylece

N = 

    0  0  1  5  1  5  0  1  5  0 

ben birden fazla satır üzerine yerleştirilen sayısı 5 ve bölünmüş şeyler yaptı.

bir döngü içinde bunu yapmak isteseydi (ve bu kimse beni gösteriş görebileceğim bir gerçek hayatta yapacağını nasıl)

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 

Çıktı:

N =

0  0  1  5  1  5  0  1  5  0 
2

Bu hile yapmak gerekir:

>> 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 
İlgili konular