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

String an bestimmter Stelle erweitern

 

King Nothing
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 20.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.09.2011, 17:51     Titel: String an bestimmter Stelle erweitern
  Antworten mit Zitat      
Hi Leute,

ich möchte an der 20. Stelle einer beliebig kürzeren Zeichenkette einen Text einfügen um somit einen dynamischen Zwischenraum zu erzeugen.
Code:

text = 'Test'
text(20:25) = 'Zusatz'
 

zeigt zwar in der Matlab-Kommandozeile (also in der Sofortausgabe) beide Textelemente an - wenn man die Variable allerdings anklickt und öffnet, wird eine 25-stellige Zeichenkette angezeigt, die allerdings nur die ersten Stellen enthält.
Code:

text = 'Test'
text = [text(1:19), 'Zusatz'];
 

führt zur Fehlermeldung: "??? Index exceeds matrix dimensions."


Hat jemand einen Tipp für mich, wie sich das bewerkstelligen lässt?

_Peter_: Bitte Codeumgebung verwenden. Danke.
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: 13.09.2011, 17:58     Titel: Re: String an bestimmter Stelle erweitern
  Antworten mit Zitat      
Hallo King Nothing,

Es gibt in Matlab keine dynamischen Zwischenräume in CHAR-Vektoren.

Die Benutzung von 'text' als Name einer Variablen ist äußerst tückisch, da damit der Befehl mit dem gleichen Namen nicht mehr verwendbar ist. Das führt zu unvorhersehbaren Problemen.

Code:
text = 'Test'
text = [text(1:19), 'Zusatz'];
führt zur Fehlermeldung: "??? Index exceeds matrix dimensions."

Die Fehlermeldung ist nachvollziehbar, oder? Wenn Du den String mit 4 Buchstaben definierst, kannst Du nicht auf die ersten 19 Buchstaben zugreifen.

Was möchtest Du denn mit einem "dynamischen" Zwischenraum erreichen?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 20.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.09.2011, 18:27     Titel:
  Antworten mit Zitat      
Mit "text" habe ich jetzt nur beispielhaft meinen etwas längeren Variablennamen ersetzt, aber danke für die Info.

Klar ist die Fehlermeldung nachvollziehbar, ich habe lediglich gehofft, dass die Zeichenkette automatisch erweitert wird, wie es bei Matrizen der Fall ist. Und das wird sie sogar! Folgender Code funktioniert z.B.:
Code:

eins = 'abc';
eins(4) = 'd'
 

Auch funktioniert:
Code:

eins = 'abc';
eins(5) = 'e'
eins(4) = 'd'
 

Nach dem zweiten Schritt wird allerdings nur 'abc' angezeigt, weil statt einem Leerzeichen einfach "nichts" an vierter Stelle steht. Ersetzt man dieses "nichts" im 3. Schritt durch 'd', wird auch die volle Zeichenkette 'abcde' angezeigt!

Leere Zwischenstellen werden in Matrizen automatisch mit Nullen gefüllt, Zeichenketten jedoch nicht mit Leerzeichen, das wäre jedoch mein Ziel.


Das ganze mache ich, um in einer listbox zwei Spalten darstellen zu können. Damit die zweite Spalte (trotz variabler 1. Spalte) immer an der 20. Stelle anfängt, benötige ich einen dynamischen Leerraum. Dachte eben, dass es einen Befehl gibt, mit dem soetwas möglich ist.
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: 13.09.2011, 18:45     Titel:
  Antworten mit Zitat      
Hallo King Nothing,

Zeichenketten sind Matrizen in Matlab. Deswegen werden sie auch exakt gleich behandelt. Ein String ist ein [1 x N] CHAR Vektor. Deshalb steht nicht "nichts" im String, wenn man an spätere Stelle Daten einfügt, sondern Nullen. Und eine Null ist nicht nichts.

Was genau meinst Du mit "anzeigen"? Darauf kommt es nämlich an:
Code:
s = 'a';
s(3) = 'b';
disp(s)
>> a b
fprintf('%s\n', s)
>> a

FPRINTF stoppt die Darstellung eines Strings, wenn ein NULL-Wert erreicht wird, als entsprechend den Konventionen in C. DISP stellt dagegen das gesamte Array dar.

Um Leerzeichen einzufügen eignet sich der SPRINTF-Befehl:
Code:
s = sprintf('%-20s%s', 'a', 'b')

Dies setzt den ersten String linksbündig mit mindestens 20 Zeichen Breite ein, wobei mit Leerzeichen aufgefüllt wird.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 20.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.09.2011, 20:15     Titel:
  Antworten mit Zitat      
Anzeigen möchte ich die Zeichenkette in der Listbox meiner Oberfläche.

Vielen Dank für den Tipp mit sprintf, Jan!
Private Nachricht senden Benutzer-Profile anzeigen
 
King Nothing
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 20.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.09.2011, 15:03     Titel:
  Antworten mit Zitat      
Jetzt muss ich doch noch einmal nachfragen:

Gibt es eine andere Möglichkeit als das Verwenden einer nichtproportionalen Schrift, um bündige Spalten in einer listbox oder einem edit-Feld zu erzeugen?

Da MS Sans Serif eine proportionale Schrift ist, wird meine Tabelle - wie im angehängten Bild zu sehen - trotz gleichlangen Zeichenketten verzerrt.

Nichtproportionale Schriften sehen nur leider nicht so gut aus, insbesondere wenn in der restlichen Oberfläche MS Sans Serif verwendet wird...

Screenshot.PNG
 Beschreibung:

Download
 Dateiname:  Screenshot.PNG
 Dateigröße:  5.22 KB
 Heruntergeladen:  687 mal
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: 15.09.2011, 15:54     Titel:
  Antworten mit Zitat      
Hallo King Nothing,

Für eine feste Zeiche-Breite benötigst Du eine feste Zeichen-Breite. Ich verwende Andale-Mono, die ich hübscher finde.

Nun kann man in UICONTROLs auch HTML verwenden. Stöbere mal in http://www.undocumentedmatlab.com.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 20.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.09.2011, 19:30     Titel:
  Antworten mit Zitat      
Ok, wenn es keine andere Möglchkeit gibt, verwende ich eben die Schriftart Monospaced. Andale-Mono ist bei mir seltsamerweise keine Monospace-Schriftart...
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: 15.09.2011, 23:32     Titel:
  Antworten mit Zitat      
King Nothing,

Seltsam. Dabei steht "Mono" doch extra für die fixe Breite.

Tabellen sind in Matlab nicht trivial. Auch UITABLE hat einige Macken.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 20.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.09.2011, 00:57     Titel:
  Antworten mit Zitat      
Keine Ahnung, bei mir wird mit Andale-Mono das Schriftbild genauso verzerrt wie mit MS Sans Serif... Monospaced ist aber auch ok... Wink
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.