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

Array mit for Schleife füllen

 

Steeef
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 02.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2014, 11:16     Titel: Array mit for Schleife füllen
  Antworten mit Zitat      
Hallo zusammen,

ich versuche ein Array mit Werten zu füllen. Dies soll mit zwei for Schleifen gelingen:

Code:
komprimiere = [128 64 32 16 8 4 2 1 1 1 2 4 8 16 32 64];
z = 1;

for i=1:1:(i<16)
    for j=komprimiere(i):-1:(j<=0)
        array(z) = i;
        z = z + 1;
    end
end



Ich erwarte ein array(z) mit 383 Einträgen. Es sollte in etwa so aussehen:
128 mal die 0
64 mal die 1
32 mal die 2
16 mal die 3
8 mal die 4
4 mal die 5
2 mal die 6
1 mal die 7
1 mal die 8
1 mal die 9
2 mal die 10
4 mal die 11
8 mal die 12
16 mal die 13
32 mal die 14
64 mal die 15

Kann mit jemand helfen? Es bricht immer nach dem ersten Durchlauf ab


Gruß
Private Nachricht senden Benutzer-Profile anzeigen


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 11.06.2014, 11:49     Titel:
  Antworten mit Zitat      
Hallo,

deine For-Schleifen-Syntax hast du bestimmt aus irgendweiner anderen Sprache übernommen und ist so nicht Matlab-like, zumindest wird es nicht das machen, was du dir vorstellst. Vielleicht hilft dir das hier ja schon weiter:
Code:
for i = 1:1:(i<16)
    disp(i)
end


Dein Problem ist ein spezieller Fall der runlength-kodierung. Dazu hat Jan S. etwas im fileexchange hochgeladen, das du dir ansehen solltest http://www.mathworks.com/matlabcent.....eexchange/41813-runlength
Man kommt bei dem Problem komplett ohne eine For-Schleife aus.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Steeef
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 02.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2014, 12:18     Titel:
  Antworten mit Zitat      
Nras hat Folgendes geschrieben:
Hallo,

deine For-Schleifen-Syntax hast du bestimmt aus irgendweiner anderen Sprache übernommen und ist so nicht Matlab-like, zumindest wird es nicht das machen, was du dir vorstellst. Vielleicht hilft dir das hier ja schon weiter:
Code:
for i = 1:1:(i<16)
    disp(i)
end


Dein Problem ist ein spezieller Fall der runlength-kodierung. Dazu hat Jan S. etwas im fileexchange hochgeladen, das du dir ansehen solltest http://www.mathworks.com/matlabcent.....eexchange/41813-runlength
Man kommt bei dem Problem komplett ohne eine For-Schleife aus.

Viele Grüße,
Nras.



Hallo Nras.,

ja die Syntax der for-Schleife habe ich aus der Sprache C in Matlab versucht zu übertragen.

Ich verstehe deinen obenstehenden Code nicht so recht. Wenn ich die Zeilen bei mir ausführe dann bekomme ich nur eine 1 zurück.

Hast du einen anderen Vorschlage wie ich mein Problem lösen kann?

Die RLE ist nicht mein Problem. Ich möchte einfach das Array mit den Zahlen füllen. Letztlich soll dieses Array als Sprungtabelle fungieren.

Gruß Steeef
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 11.06.2014, 13:02     Titel:
  Antworten mit Zitat      
Steeef hat Folgendes geschrieben:

Ich verstehe deinen obenstehenden Code nicht so recht. Wenn ich die Zeilen bei mir ausführe dann bekomme ich nur eine 1 zurück.

Genau das wollte ich dir damit sagen. (i<16) wird logisch ausgewertet und ergibt True. True ist eine 1, daher wird deine for-Schleife nach der ersten Iteration beendet.
Als doppelte-Forschleifen-Version etwa so:
Code:
z = 1;
b = 0:length(komprimiere)-1;
array = zeros(1,sum(komprimiere));
for i=1:length(komprimiere)
    for j=1:komprimiere(i)
        array(z) = b(i);
        z = z + 1;
    end
end

Das mit der runlength war schon der richtige Hinweis, du willst das "decoden". Hier der Auszug aus Jans Code mit deinem Beispiel.
Code:
komprimiere = [128 64 32 16 8 4 2 1 1 1 2 4 8 16 32 64];
n = komprimiere;
b = 0:length(komprimiere)-1;
len   = length(n);          % Number of bins
d     = cumsum(n);          % Cummulated run lengths
index = zeros(1, d(len));   % Pre-allocate
index(d(1:len-1)+1) = 1;    % Get the indices where the value changes
index(1)            = 1;    % First element is treated as &quot;changed&quot; also
index = cumsum(index);      % Cummulated indices
x     = b(index);


Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Steeef
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 02.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2014, 13:32     Titel:
  Antworten mit Zitat      
Nras hat Folgendes geschrieben:
Steeef hat Folgendes geschrieben:

Ich verstehe deinen obenstehenden Code nicht so recht. Wenn ich die Zeilen bei mir ausführe dann bekomme ich nur eine 1 zurück.

Genau das wollte ich dir damit sagen. (i<16) wird logisch ausgewertet und ergibt True. True ist eine 1, daher wird deine for-Schleife nach der ersten Iteration beendet.
Als doppelte-Forschleifen-Version etwa so:
Code:
z = 1;
b = 0:length(komprimiere)-1;
array = zeros(1,sum(komprimiere));
for i=1:length(komprimiere)
    for j=1:komprimiere(i)
        array(z) = b(i);
        z = z + 1;
    end
end

Das mit der runlength war schon der richtige Hinweis, du willst das "decoden". Hier der Auszug aus Jans Code mit deinem Beispiel.
Code:
komprimiere = [128 64 32 16 8 4 2 1 1 1 2 4 8 16 32 64];
n = komprimiere;
b = 0:length(komprimiere)-1;
len   = length(n);          % Number of bins
d     = cumsum(n);          % Cummulated run lengths
index = zeros(1, d(len));   % Pre-allocate
index(d(1:len-1)+1) = 1;    % Get the indices where the value changes
index(1)            = 1;    % First element is treated as &quot;changed&quot; also
index = cumsum(index);      % Cummulated indices
x     = b(index);


Viele Grüße,
Nras.


Hallo Nras.,

nochmals ich möchte das nicht mit dem RLE Verfahren decodieren und bin daher auch nicht an diesem Verfahren interessiert.

Ich habe dieses Array erstellt um ein weiteres array(z) mit Werten zu füllen:
Zitat:
Ich erwarte ein array(z) mit 383 Einträgen. Es sollte in etwa so aussehen:
128 mal die 0
64 mal die 1
32 mal die 2
16 mal die 3
8 mal die 4
4 mal die 5
2 mal die 6
1 mal die 7
1 mal die 8
1 mal die 9
2 mal die 10
4 mal die 11
8 mal die 12
16 mal die 13
32 mal die 14
64 mal die 15
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 11.06.2014, 13:50     Titel:
  Antworten mit Zitat      
Hey,

dann verstehe ich nicht, was du möchtest. array aus dem doppelte-For-Schleife Beispiel und x aus dem vektorisierten Beispiel sind von der Länge 383 und haben genau 128 Nullen, 64 Einsen, etc... Das ist doch genau das, was du erwartest, oder irre ich mich? Wenn ja, dann musst du mir das noch mal genauer erklären was du möchtest oder auf jemand anderes Hilfe hoffen.
Code:
>> array

array =

  Columns 1 through 15

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 16 through 30

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 31 through 45

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 46 through 60

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 61 through 75

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 76 through 90

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 91 through 105

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 106 through 120

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 121 through 135

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

  Columns 136 through 150

     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1

  Columns 151 through 165

     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1

  Columns 166 through 180

     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1

  Columns 181 through 195

     1     1     1     1     1     1     1     1     1     1     1     1     2     2     2

  Columns 196 through 210

     2     2     2     2     2     2     2     2     2     2     2     2     2     2     2

  Columns 211 through 225

     2     2     2     2     2     2     2     2     2     2     2     2     2     2     3

  Columns 226 through 240

     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3

  Columns 241 through 255

     4     4     4     4     4     4     4     4     5     5     5     5     6     6     7

  Columns 256 through 270

     8     9    10    10    11    11    11    11    12    12    12    12    12    12    12

  Columns 271 through 285

    12    13    13    13    13    13    13    13    13    13    13    13    13    13    13

  Columns 286 through 300

    13    13    14    14    14    14    14    14    14    14    14    14    14    14    14

  Columns 301 through 315

    14    14    14    14    14    14    14    14    14    14    14    14    14    14    14

  Columns 316 through 330

    14    14    14    14    15    15    15    15    15    15    15    15    15    15    15

  Columns 331 through 345

    15    15    15    15    15    15    15    15    15    15    15    15    15    15    15

  Columns 346 through 360

    15    15    15    15    15    15    15    15    15    15    15    15    15    15    15

  Columns 361 through 375

    15    15    15    15    15    15    15    15    15    15    15    15    15    15    15

  Columns 376 through 383

    15    15    15    15    15    15    15    15

>> histc(array,0:15)

ans =

  Columns 1 through 15

   128    64    32    16     8     4     2     1     1     1     2     4     8    16    32

  Column 16

    64

>> length(array)

ans =

   383


Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
Steeef
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 02.06.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.06.2014, 15:25     Titel:
  Antworten mit Zitat      
Nras hat Folgendes geschrieben:
Hey,

dann verstehe ich nicht, was du möchtest. array aus dem doppelte-For-Schleife Beispiel und x aus dem vektorisierten Beispiel sind von der Länge 383 und haben genau 128 Nullen, 64 Einsen, etc... Das ist doch genau das, was du erwartest, oder irre ich mich? Wenn ja, dann musst du mir das noch mal genauer erklären was du möchtest oder auf jemand anderes Hilfe hoffen.
Code:
>> array

array =

  Columns 1 through 15

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 16 through 30

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 31 through 45

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 46 through 60

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 61 through 75

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 76 through 90

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 91 through 105

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 106 through 120

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 121 through 135

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

  Columns 136 through 150

     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1

  Columns 151 through 165

     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1

  Columns 166 through 180

     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1

  Columns 181 through 195

     1     1     1     1     1     1     1     1     1     1     1     1     2     2     2

  Columns 196 through 210

     2     2     2     2     2     2     2     2     2     2     2     2     2     2     2

  Columns 211 through 225

     2     2     2     2     2     2     2     2     2     2     2     2     2     2     3

  Columns 226 through 240

     3     3     3     3     3     3     3     3     3     3     3     3     3     3     3

  Columns 241 through 255

     4     4     4     4     4     4     4     4     5     5     5     5     6     6     7

  Columns 256 through 270

     8     9    10    10    11    11    11    11    12    12    12    12    12    12    12

  Columns 271 through 285

    12    13    13    13    13    13    13    13    13    13    13    13    13    13    13

  Columns 286 through 300

    13    13    14    14    14    14    14    14    14    14    14    14    14    14    14

  Columns 301 through 315

    14    14    14    14    14    14    14    14    14    14    14    14    14    14    14

  Columns 316 through 330

    14    14    14    14    15    15    15    15    15    15    15    15    15    15    15

  Columns 331 through 345

    15    15    15    15    15    15    15    15    15    15    15    15    15    15    15

  Columns 346 through 360

    15    15    15    15    15    15    15    15    15    15    15    15    15    15    15

  Columns 361 through 375

    15    15    15    15    15    15    15    15    15    15    15    15    15    15    15

  Columns 376 through 383

    15    15    15    15    15    15    15    15

>> histc(array,0:15)

ans =

  Columns 1 through 15

   128    64    32    16     8     4     2     1     1     1     2     4     8    16    32

  Column 16

    64

>> length(array)

ans =

   383


Viele Grüße,
Nras.


Hallo Nras.,

entschuldige ich habe vorhin die Codezeilen völlig übersehen. Habe nur den unten Codeblock von dir gesehen und gleich geantwortet. Selbstverständlich funktioniert das genau so wie ich das wollte.

Vielen Dank für deine Zeit!!

Gruß
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.