2016-07-31 20 views
0

Ich habe zum Beispiel a=[1 2 3 4 5 6 7 8 9 10]; und ich muss alle 2 folgenden Nummern löschen von 3.
wie am Ende sollte es a=[1 4 7 10];
sein, wie dies für die Schleife ohne ein tun.Matlab löschen bestimmte Elemente aus einem Array

Und auch wenn es eine Möglichkeit gibt zu garantieren, dass das resultierende Array am Ende eine genaue Anzahl von Einträgen haben wird, wie hier sollte es a mit 4 Einträgen am Ende sein.

Aber zum Beispiel haben wir b=[1 2 3 4 5 6 7 8 9 ]; und wenn ich das immer noch am Ende sicherstellen will, ich habe 4 Einträge in der Ruhe-Array, so dass b nicht gleich [1 4 7] sein kann, weil ich sicher 4 Einträge benötigen.

+0

Welches Ergebnis möchten Sie mit 'b = [1 2 3 4 5 6 7 8 9] erhalten; '? –

+1

Wenn 'a = 1: 10;', 'a (1: 3: 10)' Ausgänge '[1, 4, 7, 10]' – Lee

+0

ich möchte erhalten b = [1 4 7 9]; weil ich genau 4 Einträge benötige, aber wenn ich jedes Mal 2 Einträge lösche, würde ich b = [1 4 7]; Deshalb muss beim Löschen des letzten Teils eines Arrays nicht 2, sondern nur ein Eintrag entfernt werden, um sicherzustellen, dass ich noch 4 Einträge in einem Array habe, so wie ich eine Art von IF- oder MAKE SURE-Bedingungen erstellen muss das Ende enthält 4 Einträge, aber nicht 3. –

Antwort

0

Wie Sie in der Frage und in den Kommentaren erwähnt, dass Sie 4 Elemente am Ende brauchen, und wenn Elemente sind weniger als 4 dann wollen Sie das letzte Element/s von b aufzunehmen, sollte die folgende Arbeiten: -

b=[1 2 3 4 5 6 7 8 9] 

b_req=b(1:3:end); 
temp=length(b_req); 
if temp<4 b_req(end+1:4)=b(end-3+temp:end); % for including the elements of b so that total elements are 4 at the end 
elseif temp>4 b_req=b_req(1:4);     % for removing the extra elements 
end 
b_req 

Ausgang: -

b = 
    1  2  3  4  5  6  7  8  9 

b_req = 
    1  4  7  9 


und wenn statt b=[1 2 3 4 5 6 7 8 9 10]; dann der gleiche Code g ives, was Sie benötigen, also
b_req = [1 4 7 10]

2

Sie die Indizierung für diese verwenden:

A = 1:10; 
B = A(1:3:end) 
B = 
    [1 4 7 10] 

Oder, wenn Sie wirklich Elemente entfernen möchten:

A = 1:10; 
A(2:3:end) = []; 
A(3:3:end) = []; 

Für Ihre zweite Frage in Bezug auf Länge Prüfung Es ist unklar, was du fragst. Wäre ein Vergleich ausreichend?

if numel(A) ~= 4 

    % ... Handle unexpected values here 

end 

Best,

0

Dieser Code spricht für sich:

a = 1:15; % some vector 
% returns every third element after the first one: 
third_elemets = a(1:3:end); 
% returns the missing elements for the vector to be in size 4 from the end of a 
last_elements = a(end-3+length(third_elemets):end); 
% take maximum 4 elements from a 
logic_ind = true(min(4,length(third_elemets)),1); 
% and concatanate them with last_elements (if there are any) 
a = [third_elemets(logic_ind) last_elements] 

und unter der Annahme, dass, wenn es weniger als vier Elemente, die Sie einfach die letzte nehmen (en) - es sollte immer arbeiten.

+0

Was ist der Sinn eines One-Liner hier? Es wird nicht besonders schnell gehen und es ist schrecklich zu lesen und zu warten ... Beachten Sie, dass ich den Aufwand zu schätzen weiß. – Ratbert

+0

@Ratbert Diese Zeile behandelt auch die meisten Fälle von weniger als 4-Element-Vektor in der Ausgabe. – EBH

+0

Warum Kommentar war nicht, was die Linie tatsächlich tut, aber warum sollte ein One Liner im Vergleich zu den anderen Lösungen hier vorzuziehen sein. – Ratbert