2012-10-09 31 views
6

¿Hay alguna manera de insertar un elemento en una matriz después de verificar un cierto valor de elemento? Por ejemplo, tomematlab: insertando elemento tras elemento?

A = [0 0 1 1 0 1 0] 

Después de cada 1 en la matriz, quiero insertar otro 1 para obtener

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

Sin embargo, quiero una manera de codificar esta para un caso general (cualquier longitud 1 fila array y los que pueden estar en cualquier orden).

Respuesta

2

Este código no es el más elegante, sino que va a responder a su pregunta ...

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 

Estoy seguro de que habrá también una forma vectorizada ...

+0

El único problema con eso es que AA crece cada iteración, lo que lo hace muy lento para vectores grandes. Si pudieras preasignar AA no habría problema, ¡pero entonces la concatenación no funciona! – Zero

+0

Sí, no es bueno para arreglos grandes, como ya dije, hay una forma vectorizada, y usted mostró una. Estaba pensando también en accumarray, pero no estoy seguro \ no experimenté cómo hacerlo con esa función ... – bla

+0

No vectorizado, pero muy claro para el lector. Definitivamente una buena respuesta, +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 

salida:

N = 

    0  0  1  5  1  5  0  1  5  0 

que hizo que los números 5 y dividir cosas insertadas en varias líneas por lo que es fácil ver lo que está pasando.

Si quería hacerlo en un bucle (y esta es la forma en que lo haría en la vida real, donde nadie puede verme mostrando)

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 

Salida:

N =

0  0  1  5  1  5  0  1  5  0 
2

Esto debería hacer el truco:

>> 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 
Cuestiones relacionadas