2012-10-09 22 views
6

क्या कोई निश्चित तत्व मान सत्यापित करने के बाद किसी सरणी में तत्व डालने का कोई तरीका है? (कोई भी अवधि 1 पंक्ति उदाहरण के लिए,matlab: तत्व के बाद तत्व डालने?

A = [0 0 1 1 0 1 0] 

ले सरणी में प्रत्येक 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 

मुझे यकीन है कि वहाँ भी एक vectorized तरीका होगा हूँ ... जवाब देंगे

+0

इसके साथ एकमात्र समस्या यह है कि एए प्रत्येक पुनरावृत्ति को बढ़ाता है, जो बड़े वैक्टरों के लिए बहुत धीमा कर देगा। यदि आप एए को प्रीलाकेट कर सकते हैं तो कोई समस्या नहीं होगी, लेकिन फिर समझौता काम नहीं करता है! – Zero

+0

हां, यह बड़े सरणी के लिए अच्छा नहीं है, जैसा कि मैंने पहले ही कहा था, एक सदिश तरीका है, और आपने एक दिखाया है। मैं accumarray के बारे में भी सोच रहा था, लेकिन मुझे यकीन नहीं है कि उस समारोह के साथ इसे कैसे किया जाए ... – 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 

आउटपुट:

एन =

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 
संबंधित मुद्दे