2017-11-08 14 views
0

Ich habe eine Matrix in MATLAB erstellt, muss aber überprüfen, ob zwei aufeinanderfolgende Zahlen (nach Zeile) = 0 und wenn es mit einem Ja oder Nein ohne angezeigt wird die Antworten. Ich habe meinen Code unter meine letzte Schleife geschrieben, gibt Fehler zurück und bin mir nicht sicher, wie ich das machen soll.MATLAB - Matrix prüfen, ob zwei aufeinanderfolgende Zahlen = 0 sind

%%Input positive integer 
n=input('Give a positive integer greater than 1: '); 
    %%Error for below 1 
if n<=1 
error('The value given is less than or equal to 1') 
end 
    %%loop for vector v 
for i=1:n 
    v(i)=2^i*3; 
end 
    %display vector 
v 

A=randi([-5,5],n,n); 

A 

x = 1; 
consecutive = false; 
for i = 1:25 
    if (A(x) + A(x+1) = 0); 
     consecutive = true; 
    end 
end 

Antwort

0

Sie müssen Ihren if Block wie folgt ändern.

if (A(x) + A(x+1) == 0); 
     consecutive = true; 
    end 

Beachten Sie die == statt nur =. Die erste ist zum Vergleich und die zweite ist für die Zuordnung. Dies wird den Fehler beseitigen, den Sie gerade bekommen. Es kann andere Probleme im Algorithmus Ihres Codes geben, aber ich habe nicht untersucht oder versucht, das zu beheben.

0

btw:

'wenn zwei aufeinanderfolgende Zahlen (Zeile) = 0'

Wenn ich Sie recht verstehe, sollten Sie versuchen ‚, wenn A (x) == 0 & & A (x + 1) == 0 '; weil '(A (x) + A (x + 1) == 0)' gilt für -5 und 5, da es gleich 0 ist. Aber -5 und 5 sind nicht zwei aufeinanderfolgende Nullen.

(oder schauen Sie auch auf der ‚diff‘ Funktion Es wird eine 0, wenn zwei folgenden Nummern zurückgeben gleich sind.)

4

Es gibt viel falsch mit dem Code Ihrer letzten Runde:

  • Sie setzen x-1 und es als Index in A verwenden, aber es nie von 1.
  • als Amit points out ändern, verwenden Sie = (für die Zuordnung verwendet wird), wenn Sie == verwendet werden soll (die equality operator).
  • Wie Gondrian points out, testen Sie, ob eine Summe gleich Null ist, aber aus Ihrer Beschreibung klingt es wie Sie testen sollten, wenn jeder Wert Null ist.
  • Ihre Schleife iteriert 25 Mal (i = 1:25), aber es ist nicht klar, warum, da Ihre Matrix A von Größe n-by-n ist.

Anstatt eine for-Schleife zu verwenden, ist es möglich, dies stattdessen mit-zu tun. Da Sie für aufeinanderfolgende Nullen durch Zeile überprüft, ist es das, was es aussehen würde:

zeroPairs = (A(:, 1:(n-1)) == 0) & (A(:, 2:n) == 0); 
consecutive = any(zeroPairs(:)); 

Der Begriff A(:, 1:(n-1)) bekommt alle „linken“ Werte in jedem Paarvergleich und der Begriff A(:, 2:n) bekommt alle die "richtiger" Wert. Diese werden mit 0 verglichen, dann combined. Dies erzeugt eine n-by-(n-1) Matrix zeroPairs, wobei ein Wert von true anzeigt, wo ein Paar aufeinanderfolgender Nullen auftritt. Diese Matrix ist reshaped into a column vector und any wird verwendet, um zu überprüfen, ob irgendwo ein Wert von true vorhanden ist.

0

eine vektorisiert Um zu zeigen, mehr Matlab-ähnlichen Ansatz:

v = 0; % sought value 
C = 2; % desired number of consecutive values in a row 
consecutive = nnz(conv2(double(A==v), ones(1,C))==C)>0; 

Dieser jeden Eintrag von A mit dem Wert v, und dann gilt 2D-Faltung mit einem Zeilenvektor von C diejenigen vergleicht. Beliebige C horizontal aufeinanderfolgende Einträge von A mit dem Wert v ergeben einen Eintrag gleich C im Faltungsergebnis. Also überprüfen wir, ob die Anzahl solcher Einträge positiv ist.

Verwandte Themen