WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Matrix mit 1er füllen zw. den Rändern

 

goenzo
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 22.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.10.2010, 19:40     Titel: Matrix mit 1er füllen zw. den Rändern
  Antworten mit Zitat      
Hallo Forum!

Gibt es eine Methode in Matlab um in einer Matrix die nur aus 0 und 1 besteht die Einträge zwischen zwei 1er alle auf 1 zu setzen?

Kleines Beispiel:

0 1 0 0 0 1 0
0 0 1 0 1 0 0

und als Ergebnis würde ich gerne folgendes haben wollen:

0 1 1 1 1 1 0
0 0 1 1 1 0 0


Ich könnte jetzt mit zwei for-Schleifen das durchgehen und eine if-Abfrage benutzen, aber das geht doch sicherlich auch einfacher oder?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.10.2010, 21:22     Titel:
  Antworten mit Zitat      
Hallo,

ich sehe auf Anhieb keine sinnvolle Möglichkeit, eine Schleife zu vermeiden.
Hier wäre eine (vielleicht noch optimierbare) Möglichkeit, mit einer statt zwei Schleifen auszukommen:
Code:
for I = 1:size(A,1)
    temp = find(A(I,:) == 1);
    A(I, temp(1):temp(end)) = 1;
end


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.10.2010, 22:00     Titel: Re: Matrix mit 1er füllen zw. den Rändern
  Antworten mit Zitat      
Hallo goenzo,

Sind die 1 symmetrisch verteilt? Oder ist die zweite 1 in jeder Zeile garantiert rechts vom Mittelpunkt? Dann könnte man das etwas vereinfachen. Aber ein wenig umständlich geht's auch so:
Code:

X = [0 1 0 0 0 1 0; ...
   0 0 1 0 1 0 0]
Y = cumsum(X);

==> [ 0 1 1 1 1 2 2; ...
   0 0 1 1 2 2 2]
Y(X == 1) = 1;

==> [ 0 1 1 1 1 1 2; ...
   0 0 1 1 1 2 2]

Y(Y == 2) = 0;

==> [ 0 1 1 1 1 1 0; ...
   0 0 1 1 1 0 0]
 

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 25.10.2010, 09:24     Titel: Re: Matrix mit 1er füllen zw. den Rändern
  Antworten mit Zitat      
goenzo hat Folgendes geschrieben:


Kleines Beispiel:

0 1 0 0 0 1 0
0 0 1 0 1 0 0

und als Ergebnis würde ich gerne folgendes haben wollen:

0 1 1 1 1 1 0
0 0 1 1 1 0 0



Hi,

ich hab das gegenteilige Porblem.
Ich möchte nicht zusammenhängende Bereiche auf Null setzen
Bsp.:

0 1 0 0 0 1 0
0 0 0 0 1 0 0
0 1 1 1 1 1 0
0 0 1 1 1 0 0

Also die 1 an Position 5 soll hier 0 werden
Ich hab mir findsubmat aus dem FEX geholt und mehrere Masken angefertigt die mir solche Bereiche auf Null setzten. Konnte aber nicht immer das gewünschte Ergeniss erhalten.

Hat jemand ne Idee?

Danke
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Achi
Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 25.10.2010, 11:02     Titel:
  Antworten mit Zitat      
Meine Idee wäre:

ich lege den Bereich (5x5MAtrix) in eine 7x7 Matrix

Code:

0     0     0     0     0     0     0
0     0     1     0     1     1     0
0     0     0     0     1     1     0
0     0     0     0     1     1     0
0     0     0     1     1     1     0
0     0     1     1     1     0     0
0     0     0     0     0     0     0
 

leg eine Schleife darüber die mir 1er sucht und dann in dessen Umgebung schaut ob wieder ne 1 vorkommt. Falls ja wird diese Position(erstere) gespeichert um dann später diese Matritzen zu einem Bild (Segmentierung)
zusammenfügt. Dazu die Frage, gibts eine Befehle, der mir sozusagen den Overlap bestimmt?
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Achi
Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 25.10.2010, 11:07     Titel:
  Antworten mit Zitat      
Ok ich denk ich weiss wie ichs mache. Ich such mir dann noch die doppeltend Einträge und dies Teilmatritzen gehören dann zusammen Wink
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.10.2010, 17:58     Titel: Re: Matrix mit 1er füllen zw. den Rändern
  Antworten mit Zitat      
Hallo Achi,

Zitat:
ich hab das gegenteilige Porblem.
Ich möchte nicht zusammenhängende Bereiche auf Null setzen
Bsp.:

0 1 0 0 0 1 0
0 0 0 0 1 0 0
0 1 1 1 1 1 0
0 0 1 1 1 0 0

Also die 1 an Position 5 soll hier 0 werden

Leider verstehe ich schon die Aufgabenstellung nicht. Welches ist die "Position 5"? Meinst Du das 5. Element, also die 1 auf Position (1,2)?
Das sind dann "nicht-zusammenhängende Bereiche"?
Willst Du einzelen Subvektoren [0, 1, 0] mit [0, 0, 0] ersetzen? Da wäre STRFIND brauchbar. STRREP macht das auch, gibt in modernen Matlabversionen aber eine Warnug aus.

Aber wie gesagt, ich habe die Frage nicht verstanden.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 26.10.2010, 08:33     Titel:
  Antworten mit Zitat      
Hi Jan,

es ist ja egal ob ich das Element mit (1,2) anspreche oder mit dem linearen Index (5).
Eigentlich suche ich nicht nur die einzelne 1 an Position 5 sondern den grrößen Bereich in dem 1 ununterbrochen vorkommen. Dabei ist es egal, ob diese darunter daneben oder diagonal dazu stehen, ohne einer 0 dazwischen.
Ich für meinen Teil teste jetzt erst mal paar seed-Algorithmen aus dem FEX.

Gruß Achi
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.10.2010, 12:23     Titel:
  Antworten mit Zitat      
Hallo Achi,

Du meinst also tatsächlich mit "Position 5" den linearen Index.
Und Du suchst nach Einsen, die andere Einsen berühren, oder?
Wenn Du also in allen 3x3-Submatrizen, die:
Code:
[0,0,0; 0,1,0; 0,0,0]

sind, die mittlere 1 durch 0 ersetzt, wäre Dein Problem gelöst, oder?
Da sollte schon ein 2D Moving-Mean-Filter über 3x3-Fensert schaffen: Alle Zahlen <= 1/9 werden auf Null gesetzt, alle anderen auf 1. Um den Rand muss man sich gesondert kümmern.
Neben dem effizienten FILTER2 könnte man das auch manuell berechnen:
Code:

n = 1000;
x = rand(n, n) < 0.5;
m = x(1:n-2, :) + x(2:n-1, :) + x(3:n, :);
m = m(:, 1:n-2) + m(:, 2:n-1) + m(:, 3:n);
y = double(m > 1) .* x(2:n-1, 2:n-1);
 

Nun ist bis auf den Rand und einzelne, von Nullen umgebene Einsen, y gleich x.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Achi
Forum-Guru

Forum-Guru


Beiträge: 250
Anmeldedatum: 14.04.10
Wohnort: ---
Version: R2007a
     Beitrag Verfasst am: 26.10.2010, 12:53     Titel:
  Antworten mit Zitat      
HAb mir wie gesagt einen Seed (Region growing) Algo rausgesucht und angepasst. Funktioniert bestens.
Aber Danke für die Anregung!

Code:
function Segment=segmentierung(Bild)


[M,N]=size(Bild);
x=M/2;
y=N/2;
x1=round(x);          
y1=round(y);  

seed=Bild(x1,y1);                                                          % seed: Startpunkt der Segmentierung
Segment=zeros(M,N);                                                        % Segment: Vorbelegung
Segment(x1,y1)=1;          
summe=seed;            
suit=1;              
count=1;              
threshold=0.5555;      
while count>0
 s=0;                
 count=0;
 for i=1:M
   for j=1:N
     if Segment(i,j)==1
      if (i-1)>0 & (i+1)<(M+1) & (j-1)>0 & (j+1)<(N+1)
       for u= -1:1                              
        for v= -1:1                              
          if  Segment(i+u,j+v)==0 & abs(Bild(i+u,j+v)-seed)<=threshold
             Segment(i+u,j+v)=1;                      
             count=count+1;                                
             s=s+Bild(i+u,j+v);                    
          end
        end  
       end
      end
     end
   end
 end
suit=suit+count;                                  
summe=summe+s;                                    
seed=summe/suit;                                  
end
 
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.