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

Dezimalzahlen -> Bitmaske

 

core
Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 07.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2013, 18:28     Titel: Dezimalzahlen -> Bitmaske
  Antworten mit Zitat      
Hi,

wieder habe ich nur eine sehr unschöne Lösung für ein eigentlich relativ einfaches Problem. Nämlich will ich Dezimalzahlen, z.B. 1-15 in ein Bitmasken-Array umwandeln. Rauskommen soll dann also

0000
0001
0010
...
1111

Bisher wandle ich über dec2bin in ein Char-Array um, steppe per Schleife durch und prüfe dann per if-Anweisung.

Scheint aber ein Problem zu sein, dass man maximal in einem Zweizeiler lösen können sollte. Wink
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: 19.05.2013, 20:03     Titel:
  Antworten mit Zitat      
Hallo,

wozu die for-Schleife?

Wenn du deinen Code posten würdest, könnte man sehen, was du eigentlich genau machen willst, und entsprechend auch Verbesserungsvorschläge liefern.
Die entscheidende Frage vor allem: soll das Ergebnis ein 15x4 char Array sein? Ein 15x1 cell Array? Vielleicht was ganz anderes?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
core
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 07.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2013, 20:47     Titel:
  Antworten mit Zitat      
Hm, ich hab den Post noch mal umformuliert. Dabei ist wohl verloren gegangen, dass das Ergebnis ein logical-Array sein sollte oder zumindest etwas, das man dann relativ einfach benutzen kann, um eine Matrix zu filtern.

Der Code schaut wie folgt aus:

Code:
function log = binstr2log(str)
    if size(str, 1) > 1
        for i = 1:size(str, 1)
            log(i, :) = binstr2log(str(i, :));
        end
    else
        log = false(1, numel(str));
        for ci = 1:numel(str)
            c = str(ci);
            if c == '1'
                log(ci) = true;
            end
        end
    end
end


Aufgerufen wird es dann per binstr2log(dec2bin(1:15))
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: 19.05.2013, 21:59     Titel:
  Antworten mit Zitat      
Hallo,

das ist nun wirklich etwas umständlich ;)

Alternative Möglichkeiten:
Code:
logical(arrayfun(@str2double, dec2bin(1:15))); % oder
arrayfun(@(x) strcmp(x, '1'), dec2bin(1:15))


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
core
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 07.07.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2013, 23:08     Titel:
  Antworten mit Zitat      
Ja, ich sag ja, wenn irgendwann der Brute-Force-Hammer kommt, wirds selten schön. Smile

Aber arrayfun kannte ich auch noch nicht. Auf jeden Fall viel schönere Lösungen. Vielen Dank.
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: 19.05.2013, 23:22     Titel:
  Antworten mit Zitat      
Hallo core,

Wie wäre es mit:
Code:
L = (dec2bin(1:15) == '1');

Da kann man sogar auch auf arrayfun() verzeichten.

Dabei ist die Umwandlung in einen String innerhalb von DEC2BIN eigentlich schon unnötig indirekt. Wenn man die nicht benötigten Details weglässt, kommt man zu:
Code:
cols = 4;
L = rem(floor((1:15).' * pow2(1 - cols:0)), 2)

Gruß, Jan
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: 20.05.2013, 09:25     Titel:
  Antworten mit Zitat      
Hallo Jan,

insbesondere das erste gefällt mir gut :) Schön einfach!

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2013, 07:56     Titel:
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Dabei ist die Umwandlung in einen String innerhalb von DEC2BIN eigentlich schon unnötig indirekt. Wenn man die nicht benötigten Details weglässt, kommt man zu:
Code:
cols = 4;
L = rem(floor((1:15).' * pow2(1 - cols:0)), 2)

Gruß, Jan


Sehr arg gelöst.
Gefällt mir gut.

LG
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.