2012-10-09 61 views
6

Có cách nào để chèn phần tử vào mảng sau khi xác minh giá trị phần tử nhất định không? Ví dụ, hãyMATLAB: chèn phần tử sau phần tử?

A = [0 0 1 1 0 1 0] 

Sau mỗi 1 trong mảng, tôi muốn chèn 1 khác để có được

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

Tuy nhiên tôi muốn có một cách để mã này cho một trường hợp chung (bất kỳ chiều dài 1 hàng mảng và những cái có thể theo thứ tự bất kỳ).

Trả lời

2

Mã này không phải là thanh lịch nhất, nhưng nó sẽ trả lời câu hỏi của bạn ...

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 

tôi chắc chắn rằng sẽ có cũng là một cách vectorized ...

+0

Vấn đề duy nhất là AA phát triển mỗi lần lặp lại, điều này sẽ làm cho nó rất chậm đối với các vectơ lớn. Nếu bạn có thể preallocate AA sẽ không có vấn đề, nhưng sau đó các concatenation không hoạt động! – Zero

+0

Vâng, nó không tốt cho mảng lớn, như tôi đã nói, có một cách vectorized, và bạn đã cho thấy một. Tôi đã suy nghĩ cũng về accumarray, nhưng tôi không chắc chắn \ không có kinh nghiệm làm thế nào để làm điều đó với chức năng đó ... – bla

+0

Không vectorized, nhưng rất rõ ràng cho người đọc. Chắc chắn là một câu trả lời hay, +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 

Đầu ra:

N = 

    0  0  1  5  1  5  0  1  5  0 

Tôi đã chèn số 5 và chia thành nhiều dòng để dễ dàng xem điều gì đang diễn ra.

Nếu bạn muốn làm điều đó trong một vòng lặp (và đây là cách tôi sẽ làm điều đó trong cuộc sống thực mà không ai có thể thấy tôi khoe khoang)

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 

Output:

N =

0  0  1  5  1  5  0  1  5  0 
2

này nên làm như lừa:

>> 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 
Các vấn đề liên quan