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

Hilfe bei for-loop

 

Lyckan
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 24.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2010, 20:24     Titel: Hilfe bei for-loop
  Antworten mit Zitat      
Hallo!

Ich will einen Farbgradienten programmieren. Das Unterprogramm, dass ich anhänge, wird von einem Hauptprogramm aufgerufen. Input sind alle Werte, die oben angegeben sind.

Das Programm macht auch einen schönen Gradienten, nur habe ich das Problem, dass es sich über meine Weite-Angaben hinweg setzt...
Es muss etwas mit dem for-loop zu tun haben, hinter den ich im Programm ???? geschrieben habe.
Eigentlich wollte ich folgendes:
Die Breite (als Beispiel, für die Höhe gilt das Gleiche) des Bildes wird abgefragt. Die Farben (a1,a2,a3 für Startfarben, b1,b2,b3 für Endfarben; 0 bis 255) und die Anzahl Schritte (2 bis 256) werden abgefragt. Jetzt kann es aber sein, dass durch ungünstige Anzahl der Farben und Schritte der Farbvektor länger ist als die Matrix (heightxwidth). Also nehme ich den letzten Schritt und teile ihm die Endfarbe zu. Der Schritt ist aber möglicherweise zu lang, also nehme ich das Ende des vorherigen Schrittes (steps-1)*p bis height und weise ihm die Endfarbe zu. Zumindest war es so gedacht.
Wenn ich das als if-loop schreibe, bekomme ich statt der gewünschten Bildbreite die Anzahl unterschiedlicher Farben. Und als for-loop meckert Matlab. Warum???

for s > height % ?????
grad((steps-1)*p:height,:,1) = f1(steps);
end

War etwas konfus, und ich weiss auch nicht so genau, wie ich das Problem beschreiben soll. Kurz: das Bild hat nicht die gewünschte Breite...

Vielleicht kann mir ja jemand helfen?

Achso, wenn ich das hier schon eingestellt habe: der Prof meckert über mein switch-case und beanstandet "falschen syntax" und "falsche Reihenfolge der Argumente". Habt Ihr eine Ahnung, was da falsch sein könnte? Ansonsten funktioniert das Programm ja (wenn ich die andere Fehlerstelle ausschalte).

LG Lyckan

img_gradient_d.m
 Beschreibung:

Download
 Dateiname:  img_gradient_d.m
 Dateigröße:  2.19 KB
 Heruntergeladen:  862 mal
Private Nachricht senden Benutzer-Profile anzeigen


michai
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 22.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2010, 08:55     Titel:
  Antworten mit Zitat      
mmm... Du weißt schon was ein for-loop ist, oder?

Mach mal aus den "for s > ..." jeweils ein "if s > ...", dann bist du zumindest syntaktisch wieder sauber.

An den switch case Konstrukten gibt's nix zu meckern.

Schöne Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Lyckan
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 24.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2010, 09:55     Titel:
  Antworten mit Zitat      
Hallo!

Mit if hatte ich es auch versucht. Nun meckert Matlab zwar nicht mehr, aber das Problem, dass das Bild zu breit (oder zu hoch ist), habe ich immer noch.

LG Lyckan
Private Nachricht senden Benutzer-Profile anzeigen
 
michai
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 22.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2010, 11:19     Titel:
  Antworten mit Zitat      
Da wird wohl was in deinen Berechnungen im Argen sein. Bevor ich mir das angucke schon mal ein paar Dinge:

- In deinem eigenen Interesse: Bitte kommentiere deinen Code mal etwas. Mindestens solltest du einen Hilfe-Kommentar erstellen. Dazu schreibst du einfach einen Kommentarblock unter deinen Funktionskopf und beschreibst beispielsweise, was deine Funktion tut, was deine Übergabeparameter bedeuten und von welchem Format sie sind. So kannst du oder jemand anders später einfach "help img_gradient_d" eingeben und erhält einen schnellen Überblick über die Benutzung der Funktion.

- Du fragst nirgendwo die Anzahl der Übergabeparameter ab. Ich kann die Funktion aber auch so aufrufen: "a=img_gradient_d(1024,768,[0 0 0],[255 0 0], 13)". Dann knallt es. So geht's z.B.:
Code:

if nargin < 6
    error('Zu wenige Übergabeparameter!');
end
 

Einfach nach deinem Funktionskopf einfügen bevor du irgendwelche Berechnungen anfängst.

- Deine Funktionsaufrufe "round(f1);" tun gar nix. Ist das Absicht?

- Es wäre hilfreich, wenn du mal einen Satz Übergabeparameter nennen würdest, mit dem z.B. dein Problem auftritt. Sonst muss hier jeder Suchen und rumprobieren.

Schöne Grüße Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
michai
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 22.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2010, 13:14     Titel:
  Antworten mit Zitat      
Hab mir deine Funktion mal ein bischen angeguckt und damit rumgespielt.
Ich will gar nicht meckern. Nur soviel: In deiner Schleife
Code:

for n = 1:steps-2
            grad(:,n*p:(n+1)*p,1) = f1(n+1);
...
 

hast du Überschneidungen der Bereiche, also beispielsweise im ersten Durchlauf schreibst du 4:8 im nächsten Durchlauf 8:12.
Das ist bei bestimmten Bildgrößen nicht schlimm, bei einer Bildhöhe von 10 und 9 Schritten werden so aber nur noch 5 oder 6 Schritte dargestellt.
Wenn steps größer als die jeweilige Kantenlänge ist wird auch nur die Startfarbe dargestellt.
Hier ist also sicher noch Verbesserungsbedarf.

Das Hauptproblem handelst du dir auf jeden Fall über das "ceil()" ein.
Beispiel:
Kantenlänge = 768, steps = 254
768/254 = 3.025..., dein p = 4
In der Schleife gehst du bis (n+1)*p=1012, also erheblich über 768.

Was du vor hast, wenn ich es richtig verstehe, ist zu gucken wieviele Zeilen (oder Spalten) im Bild jeweils von einer Farbe belegt werden. Da du 3,025 Zeilen nicht zeichnen kannst, rundest du auf 4 auf. Das Problem ist aber, dass du nach 100 Durchläufen bei Zeile 400 bist, aber eigentlich erst bei Zeile 303 sein dürftest.
Besser wäre also nicht von vornherein zu runden und alles nach hinten zu verschieben sondern lieber bei jedem Bereich neu zu runden.

Hier mal eine mögliche Lösung:
Code:

function img = img_gradient_d(width, height, colour1, colour2, steps, direction)      
% Hier Hilfetext einfügen
% und Parameter beschreiben

if nargin < 6
    error('Too few arguments!');
end

a1 = colour1(1);
a2 = colour1(2);
a3 = colour1(3);

b1 = colour2(1);
b2 = colour2(2);
b3 = colour2(3);

grad = zeros(height,width,3);                                              

f1 = round(linspace(a1,b1,steps));
f2 = round(linspace(a2,b2,steps));                                                
f3 = round(linspace(a3,b3,steps));                                              


if strcmp(direction, 'vertical')
    stepSize = height/steps;
else
    stepSize = width/steps;
end

toRange = 0;
if strcmp(direction, 'vertical')
    for n = 1:steps
        fromRange = toRange + 1;
        toRange = ceil(n * stepSize);
       
        grad(fromRange:toRange, :, 1) = f1(n);
        grad(fromRange:toRange, :, 2) = f2(n);
        grad(fromRange:toRange, :, 3) = f3(n);
    end
else
    for n = 1:steps
        fromRange = toRange + 1;
        toLine = ceil(n * stepSize);
       
        grad(:, fromRange:toRange, 1) = f1(n);
        grad(:, fromRange:toRange, 2) = f2(n);
        grad(:, fromRange:toRange, 3) = f3(n);
    end
end

img = uint8(grad);
imagesc(img);
end
 


Schöne Grüße Wink

P.S.: Wenn "if x>y" nicht geht, geht "for x>y" erst recht nicht. Razz
Private Nachricht senden Benutzer-Profile anzeigen
 
Lyckan
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 24.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.03.2010, 17:00     Titel:
  Antworten mit Zitat      
Hallo!

Sorry, dass ich erst jetzt antworte. Habe kranke Kinder zu Hause, da ist momentan nicht viel mit Programmieren...

Das Bild ist aber immer noch zu gross... Also die eingegebene Höhe oder Breite ist kleiner als die tatsächliche... Mal schauen, ob ich das irgendwie hinbekomme.

Die fehlende Dokumentation liegt daran, dass ich nicht auf deutsch studiere und deshalb die Dokumentation entfernt habe. Faulerweise habe ich sie nicht auf deutsch übersetzt Sad.

LG Lyckan
Private Nachricht senden Benutzer-Profile anzeigen
 
michai
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 22.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.03.2010, 07:21     Titel:
  Antworten mit Zitat      
Kranke Kinder sind nicht gut. Kenne das. Sad

Ich versteh das nicht ganz mit "Das Bild ist aber immer noch zu gross... Also die eingegebene Höhe oder Breite ist kleiner als die tatsächliche". Wenn ich width = 1024 und height = 768 beim Funktionsaufruf übergebe erhalte ich einen Gradienten in genau diesen Dimensionen. Oder verstehe ich da was falsch?
Erklär das mal genauer.
Private Nachricht senden Benutzer-Profile anzeigen
 
Lyckan
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 24.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2010, 10:52     Titel:
  Antworten mit Zitat      
Hallo!

Also, ich lasse das Programm mit folgenden Eingaben laufen:
Breite 190
Höhe 90
Sartfarbe [0 0 255]
Endfarbe [255 0 0]
Schritte 87
vertical

Dann bekomme ich einen schönen Gradienten, aber die Höhe des Bildes ist etwa 175 (ich denke mal 174, weil 87x2=174)... Die Breite mit 190 stimmt.

LG Lyckan

PS: Wenn ich ein Bild 10x10 erstelle mit 4 Schritten, geht es auch bis 12 statt bis 10.
Private Nachricht senden Benutzer-Profile anzeigen
 
michai
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 22.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2010, 11:56     Titel:
  Antworten mit Zitat      
mmm... kann ich nicht nachvollziehen. Zugegebenermaßen tritt ein Rundungsfehler auf, der dazuführt dass statt 190x90x3 ein 191x90x3 herauskommt.

Hast du den Code aus meinem Post genommen?

In Zeile 43 muss es natürlich auch toRange statt toLine heißen.

Hier nochmal ein update mit der Deckelung:
Code:

function img = img_gradient_d(width, height, colour1, colour2, steps, direction)      
% Hier Hilfetext einfügen
% und Parameter beschreiben

if nargin < 6
    error('Too few arguments!');
end

a1 = colour1(1);
a2 = colour1(2);
a3 = colour1(3);

b1 = colour2(1);
b2 = colour2(2);
b3 = colour2(3);

grad = zeros(height,width,3);                                              

f1 = round(linspace(a1,b1,steps));
f2 = round(linspace(a2,b2,steps));                                                
f3 = round(linspace(a3,b3,steps));                                              


if strcmp(direction, 'vertical')
    stepSize = height/steps;
else
    stepSize = width/steps;
end

toRange = 0;
if strcmp(direction, 'vertical')
    for n = 1:steps
        fromRange = toRange + 1;
        toRange = ceil(n * stepSize);
       
        if (toRange > height)
            if fromRange > height
                break;
            else
                toRange = height;
            end
        end
       
        grad(fromRange:toRange, :, 1) = f1(n);
        grad(fromRange:toRange, :, 2) = f2(n);
        grad(fromRange:toRange, :, 3) = f3(n);
    end
else
    for n = 1:steps
        fromRange = toRange + 1;
        toRange = ceil(n * stepSize);
       
        if (toRange > width)
            if fromRange > width
                break;
            else
                toRange = width;
            end
        end
       
        grad(:, fromRange:toRange, 1) = f1(n);
        grad(:, fromRange:toRange, 2) = f2(n);
        grad(:, fromRange:toRange, 3) = f3(n);
    end
end

img = uint8(grad);
imagesc(img);
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Lyckan
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 24.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2010, 13:01     Titel:
  Antworten mit Zitat      
Jetzt geht es!!! Superlieben Dank!!!

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