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

Ziffer aus einer Zahl lesen

 

Autodidakt
Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 08.02.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2020, 07:12     Titel: Ziffer aus einer Zahl lesen
  Antworten mit Zitat      
Hallo Leute,

ich muss in Simulink aus einer Zahl

Bsp: 4681012

Ziffern auslesen und neue zahlen daraus machen.


Wenn obriges Bsp eingelesen wurde, brauche ich die erste Ziffer (4) und die nächsten drei Ziffern (681). Ich will also am Ende die Zahl 4 und die Zahl 681 haben und weiter verarbeiten, der Rest wird ignorieren. Sollte machbar sein, aber als jemand der vornehmlich miit LabVIEW arbeitet bin ich gerade etwas ratlos.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen


T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2020, 07:33     Titel:
  Antworten mit Zitat      
Code:
num=12312345445;
digits=arrayfun(@(x) mod(floor(num/10^x),10),floor(log10(num)):-1:0)


Schamlos geklaut von: https://de.mathworks.com/matlabcent.....r-in-to-individual-digits

Einfacher verständlich, aber ineffizienter, ist eine Konvertierung in einen String (num2str). Da ein String nichts anderes ist als ein Char-Array, kannst du mit str(1), str(2) etc. auf die einzelnen Ziffern zugreifen, musst sie aber evtl. wieder in integer zurückkonvertieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
Autodidakt
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 08.02.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2020, 07:53     Titel:
  Antworten mit Zitat      
Okay, wie binde ich das in ein Simulinkmodel ein? Sorry hab keinen Plan.
Private Nachricht senden Benutzer-Profile anzeigen
 
T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2020, 08:09     Titel:
  Antworten mit Zitat      
Mit dem Matlab-function Block kannst du beliebige Matlabfunktionen in Simulink einbinden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Autodidakt
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 08.02.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2020, 10:04     Titel:
  Antworten mit Zitat      
Ok, noch einmal für Nullchecker wie mich. Ich hab in meinem Simulinkmodel jetzt den Matlabfunctionblock, im Kopf steht das was reinkommt und was rausgeht. Der Eingang ist immer ein uint16. Mich interessiert aber nur die erste Ziffer und die Ziffern 2-4 die eine eigene Zahl egeben sollen.

Der Block an sich funktioniert, die Platzhalterrechnungen "Eingang +- 500" geben korrekte Zahlenwerte aus. Ich habe aber weiter keinen Plan wie ich vorgehen soll um mein gewünschtes Ergebnis zu erreichen.

Die auskommentierte Umwandlung in String funktioniert funktioniert ohne Fehlermeldung, braucht aber soviel Zeit, dass ich diese nicht weiter verfolgen will.


Code:
function [Fehlerebene,Fehlercode] = Zerlegung(Eingang)

Ziffer1 = Eingang+500;
Ziffer2bis4 = Eingang-500;

Fehlerebene = Ziffer1 ;
Fehlercode = Ziffer2bis4;



%StringEingang = int2str(Eingang)
%X = str2double(StringEingang)
Private Nachricht senden Benutzer-Profile anzeigen
 
T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2020, 10:56     Titel:
  Antworten mit Zitat      
Einfach meinen code reinkopieren und anstelle von num deine Eingangsvariable benutzen. Außerdem musst du noch die drei Ziffern zu einer dreistelligen Zahl zusammensetzen, dafür multiplizierst du Ziffer 2 mit 100, 3 mit 10 und 4 mit 1 und addierst alles auf:

Code:
function [Fehlerebene,Fehlercode] = Zerlegung(Eingang)

digits=arrayfun(@(x) mod(floor(Eingang/10^x),10),floor(log10(Eingang)):-1:0)
Fehlerebene=digits(1);
Fehlercode=digits(2)*1e2+digits(3)*1e1+digits(4)*1e0;
end

 


So ungefähr, habs nicht getestet.
Private Nachricht senden Benutzer-Profile anzeigen
 
Autodidakt
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 39
Anmeldedatum: 08.02.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2020, 11:19     Titel:
  Antworten mit Zitat      
Bekomme Fehlermeldungen des Todes......... ok, wenn jemand weiß wie es richtig geht, wäre ich dankbar, dannhätte ich was dazugelernt. Mein Problem hab ich mittlerweile mit Modulu gelöst. Auf jeden Fall vielen Dank.

Zitat:
Simulink does not have enough information to determine output sizes for this block. If you think the errors below are inaccurate, try specifying types for the block inputs and/or sizes for the block outputs.
Component:MATLAB Function | Category:Coder error
Function 'arrayfun' is not supported for code generation. Consider adding coder.extrinsic('arrayfun') at the top of the function to bypass code generation.

Function 'MATLAB Function' (#35.63.132), line 3, column 8:
"arrayfun(@(x) mod(floor(Eingang/10^x),10),floor(log10(Eingang)):-1:0)"
Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Undefined function or variable 'digits'. The first assignment to a local variable determines its class.

Function 'MATLAB Function' (#35.145.151), line 4, column 13:
"digits"
Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Undefined function or variable 'digits'. The first assignment to a local variable determines its class.

Function 'MATLAB Function' (#35.167.173), line 5, column 12:
"digits"
Launch diagnostic report.
Component:MATLAB Function | Category:Coder error
Errors occurred during parsing of MATLAB function 'MATLAB Function'
Component:MATLAB Function | Category:Coder error
Simulink cannot determine sizes and/or types of the outputs for block 'MATLAB Function' due to errors in the block body, or limitations of the underlying analysis. The errors might be inaccurate. Fix the indicated errors, or explicitly specify sizes and/or types for all block outputs.
Component:MATLAB Function | Category:Coder error
Simulink cannot determine sizes and/or types of the outputs for block 'MATLAB Function' due to errors in the block body, or limitations of the underlying analysis. The errors might be inaccurate. Fix the indicated errors, or explicitly specify sizes and/or types for all block outputs.
Component:Simulink | Category:Model errorOpen
Error occurred in 'call_stats_block2/MATLAB Function'.
Private Nachricht senden Benutzer-Profile anzeigen
 
T16
Forum-Century

Forum-Century


Beiträge: 145
Anmeldedatum: 31.01.18
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2020, 11:36     Titel:
  Antworten mit Zitat      
Spannend, bei mir läuft es ohne Probleme durch (2020a, siehe Bild).

Code:
Function 'arrayfun' is not supported for code generation.


Vermutl. funktioniert das mit deiner Matlabversion nicht, probier doch mal diese (ebenfalls schamlos von der o.g. Seite geklaute) Variante ohne arrayfun um die Zahl zu zerlegen:
Code:

N=1234
m = floor(log10(N));  
digits = mod(floor(N ./ 10 .^ (m:-1:0)), 10);
 


Unbenannt.JPG
 Beschreibung:

Download
 Dateiname:  Unbenannt.JPG
 Dateigröße:  213.52 KB
 Heruntergeladen:  277 mal
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 - 2024 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.