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

Strings per for-Schleife zusammenfügen

 

Hector
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 25.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2013, 18:02     Titel: Strings per for-Schleife zusammenfügen
  Antworten mit Zitat      
Ein freundliches Hallo Smile

Ich versuche etwas zu programmieren, was mir aus einem Buchstabensalat ein wirkliches Wort gibt.

Code:

bsp={'a' 'f' 'l' ; 'b' 'o' 'r' ; 'i' 'p' 'i'};

for i=1:3
        matt{i}= bsp{i,1};
end

testword=[matt{1} matt{2} matt{3}]; % <---  möchte ich mit einer for-Schleife automatisiert haben
test=find(strcmp(testword, woerter_liste)); % vergleicht ob "abi" ein wirkliches Wort ist.

 


Also gegeben ist eine zufällige 3x3 Zellen-Matrix "bsp" gefüllt mit Buchstaben.
Mit der for-Schleife greife ich die 1.Zeile ab und "matt" sieht dann aus wie:
Code:
matt=
'a' 'b' 'i'
.

Damit ich nun aber wirklich nach " 'abi ' " suchen kann, muss ich ja die einzelnen Zellen zusammenfügen, was ich manuell gemacht habe. Aber das kann ja nicht im Sinne des programmierens sein Sad

MfG,
Hector
Private Nachricht senden Benutzer-Profile anzeigen


markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 25.09.2013, 18:37     Titel:
  Antworten mit Zitat      
Code:

>> strjoin(matt)                    

ans =

a b i

>> ans(ismember(ans,' ,.:;!')) = []

ans =

abi
 


Aber ich glaube strjoin gibt es erst seit 2013a?
Kannst du dir aber auch selber bausteln

Code:

function out = sj (in)
    out = [in{:}];
end
 


Funktioniert dann so:

Code:

>> sj(matt)  

ans =

abi
 


Und komplett ohne Schleife (ohne ist immer besser) und ohne weiteren Funktionen kannst du das Wort auch direkt aus der bsp Zelle extrahieren.

Code:

>> [bsp{:,1}]

ans =

abi
 

_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Hector
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 25.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.09.2013, 19:31     Titel:
  Antworten mit Zitat      
(ja, habe nur 2012b), aber wow.. danke markuman!
an eine extra Funktion habe ich auch gedacht, aber wusste nicht wie.
Code:
out = [in{:}]

ist natürlich.. clever..
das ich " : " derart in den eckigen Klammern (im Umgang mit Strings) verwenden kann, dass es sie so schön aneinanderreiht, das wir mir bisher nicht klar.

Vielen Dank! nur..

warum? Confused

Wenn ich genau das Gleiche mache mit einem skalaren Zeilenvektor, dann werden alle Einträge senkrecht ausgegeben Confused

Code:
v=[1 2 3 4];
[v(:)]
ans =
     1
     2
     3
     4


daher hätte ich gedacht, dass mir " [in{:}] " die Buchstaben auch untereinander ausgibt.
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 25.09.2013, 22:28     Titel:
  Antworten mit Zitat      
Hector hat Folgendes geschrieben:


Wenn ich genau das Gleiche mache mit einem skalaren Zeilenvektor, dann werden alle Einträge senkrecht ausgegeben Confused

Code:
v=[1 2 3 4];
[v(:)]
ans =
     1
     2
     3
     4


daher hätte ich gedacht, dass mir " [in{:}] " die Buchstaben auch untereinander ausgibt.


Die eckigen Klammern werden für Vektoren und Matrizen verwendet. Siehe auch http://www.mathworks.de/de/help/matlab/ref/specialcharacters.html
Macht also nicht viel Sinn was du da versuch hast.
Untereinander funktioniert so:

Code:

octave:11> [matt{:}]'
ans =

a
b
i

octave:12> v=[1 2 3 4]
v =

   1   2   3   4

octave:13> v'
ans =

   1
   2
   3
   4

octave:14> v=[1 2 3 4] '
v =

   1
   2
   3
   4

 

_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Hector
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 25.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.09.2013, 01:25     Titel:
  Antworten mit Zitat      
ah, bei der letzten Frage haben wir etwas an uns vorbei geschrieben. habe mein Verständnisproblem auf folgendes reduziert:
Warum wird

Code:
[matt{:}]

ans =

abi


praktischerweise waagerecht ausgegeben (damit ich z.B. "strcmp" benutzen kann), während

Code:
[matt(:)]

ans =

    'a'
    'b'
    'i'
 


(normal, gemäß dem Doppelpunkt Operator, was er immer tut) senkrecht ausgegeben??
(ich vermute ich habe da eine Wissenlücke was Cell-Arrays angeht) Sad

EDIT: ah, denke habe verstanden.. simple Lösung/Tatsache:
weil character arrays einfach immer horizontal im output erscheinen?! Idea
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: 26.09.2013, 09:15     Titel:
  Antworten mit Zitat      
Hallo Hector,

Code:
matt = {'a', 'b', 'i'};

Mit "[matt{:}]" wird zunächst die innere Referencierung durchgeführt, wobei die geschweiften Klammern die Elemente aus dem Cell Array extrahieren:
Code:
[matt{:}]
==> [matt{1}, matt{2}, matt{3}]
==> ['a', 'b', 'i']
==> 'abi'

Der [ ] operator ist dabei identisch zum horzcat Befehl, er verkettet also die enthaltenen Vektoren order Arrays horizontal. Bei scalaren CHARs oder Strings (also CHAR-Vektoren) kommt dabei ein String heraus.

"[matt(:)]" ist etwas ganz anderes. Hier wird zunächst das Cell-Array in einen Spalten-Vektor "reshaped":
Code:
[matt(:)]
==>[reshape(matt, numel(matt), 1)]
==>[matt{1}; matt{2}; matt{3}]  % Langsam! "matt(:)" ist viell besser!
 

Nun führt der HORZCAT-Befehl zu keiner Veränderung, weil alle enthaltenen Elemente nur noch die Breite 1 haben. Also bekommt man als Ergebnis ein {3 x 1} cell string, eben:
Code:
   'a'
    'b'
    'i'


Zitat:
EDIT: ah, denke habe verstanden.. simple Lösung/Tatsache:
weil character arrays einfach immer horizontal im output erscheinen?! :idea:

Nein. Character-Arrays werden genauso behandelt wie andere Arrays auch, bis darauf, dass Mutli-dimensionale CHAR Arrays nur begrenzt sinnvoll sind.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Hector
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 25.09.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.09.2013, 18:57     Titel:
  Antworten mit Zitat      
ein großes aahhhhh... Smile

das hat mir sehr im Verständnis zu Zellen und Strings geholfen.

Danke Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
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.