goMatlab - Mein MATLAB Forum

Mein MATLAB Forum

 
Login  | Registrieren
Bücher:

MATLAB, Simulink, Stateflow: Grundlagen, Toolboxen, Beispiel

Fachkräfte:
Testingenieur (w/m) Testframework für Simulink-basierte Echtzeitanwendungen
Pflege des MATLAB/Simulink-Testframeworks, Spezifizieren von Testkriterien, Testfällen und Testszenarien
dSPACE GmbH - Paderborn

Softwareentwickler MATLAB/Simulink (w/m)
Erarbeitung von Lösungen im Bereich der Schnittstelle zum Simulink-Modell und der Benutzeroberfläche von TargetLink
dSPACE GmbH - Paderborn

Testingenieur (w/m) Konfigurationswerkzeuge für Echtzeitsysteme
Einbinden von Simulink®-Simulationsmodellen, Verteilung der Simulationsmodelle auf Multicore- und Multiprozessorsysteme
dSPACE GmbH - Paderborn

Entwicklungsingenieur Steuergerätetest Hardware-in-the-Loop (m/w)
Konzeption und Automatisierung von Tests für Steuergeräte und Steuergeräteverbünde
MBtech Group GmbH & Co. KGaA - München, Sindelfingen bei Stuttgart, Stuttgart

Support-Ingenieur/-in
Diagnose von Anwenderproblemen
AFT Atlas Fahrzeugtechnik GmbH - Werdohl

weitere Angebote

Partner:




Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

komplizierte Randomisierung

 

Doktorand
Forum-Newbie
Forum-Newbie

Beiträge: 2
Anmeldedatum: 31.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.01.2012, 16:22     Titel: komplizierte Randomisierung
  Antworten mit Zitat      
Hallo,

seit einiger Zeit zerbreche ich mir wie verrückt den Kopf, um folgendes Problem zu lösen, komme aber wirklich nicht mehr weiter:

Für ein psych. Experiment möchte ich eine Stimulusabfolge erstellen. Für jeden Probanden möchte ich eine eigene randomisierte Liste erstellen. An und für sich ist das kein Problem, jedoch gibt es einige Restriktionen bzgl. der Randomisierung. Und hier liegt mein Problem...

Aber vielleicht zunächst einmal zum Aufbau: Ich habe 30 Bilder. Jedes Bild wird dreimal gezeigt (also 90 Durchgänge). Die 30 Bilder werden auf zwei Bedingungen (hier mal Kat. 1 und 2 genannt) aufgeteilt. Bilder der Kategorie 1 werden in der Abfolge jeweils direkt hintereinander gezeigt, Bilder der Kategorie 2 haben jeweils 5-10 andere Bilder dazwischen. Diese dazwischen liegenden Bilder können aus Kategorie 1 oder 2 sein.

Bisher habe ich folgendes versucht: Ich lasse mir zunächst einen Vektor mit meinen 30 Bilder erstellen. Diesen mische ich durch. Dann erstelle ich die Bedingungen und zuguterletzt einen Nullvektor um die Bilder dann einzufügen. In einer Schleife generiere ich mir dann die Sequenz unter Beachtung der Restriktionen.

Leider führt dies aber zu keinem Ergebnis Sad ! Entweder sagt MATLAB mir, dass die Matrix Dimension überschritten wurde oder aber - wenn ich die Nullmatrix auf mehr als 90 Stellen vergrößere - schreibt er mir zwar eine Sequenz, aber es befinden sich noch Nullen in der Matrix. Sobal dich diese lösche, werden die Restriktionen verletzt, sprich der Abstand zwischen zwei Stimuli ist kleiner als 5 (größer als 10 hatte ich bisher noch nicht).

Ein Umweg war es bisher für mich, die Sequenz zu erstellen, und dann PER HAND die fehlerhaften Stimuli zu verrücken. Das ist aber sehr mühsam und v.a. zeitaufwendig. Außerdem denke ich mir, was per Hand geht, muss doch auch per Software gehen.

Ich wäre wirklich über jeden Denkanstoß bzw. Hilfe bei der Programmierung dankbar!!!

Code:

%% VARIABLES
clc, clear all

% Objects
obj = (1:1:30);
obj = obj(randperm(30));

% Conditions
cond(1:15) = 1;
cond(16:30) = 2;
cond = cond(randperm(30));

% Number of intervening stimuli
int = [6,7,8,9,10,11];

% to put in the objects
sequence(:,90) = zeros;

%% RANDOMIZER
i = 1;

for i = 1:length(obj)
    if cond(i) == 1 % check whether it's condition 1 or 2
        if sequence(:,i:i+2) == 0 % if it's condition 1, put the object i three times in a row
            sequence(:,i:i+2) = obj(i);
        else
            search = find(sequence(:,:) == 0); % find a free spot
                for k = 1:length(sequence)
                    if sequence(:,search(k):search(k)+2) == 0
                        sequence(:,search(k):search(k)+2) = obj(i);
                        break
                    end
                end
        end
    elseif cond(i) == 2 % if it's condition 2...
        search = find(sequence(:,:) == 0); % find the free places in the sequence
        for j = 1:length(sequence)
            int = int(randperm(6));
            if sequence(:,search(j)) == 0 && sequence(1,search(j)+int(1)) == 0 && sequence(1,search(j)+int(1)+int(2)) == 0 % put the object i at appropiate places in the sequence
               sequence(:,search(j)) = obj(i);
               sequence(:,search(j)+int(1)) = obj(i);
               sequence(:,search(j)+int(1)+int(2)) = obj(i);
            end
        end  
    end
i = i+1;
end
 


Mein Gedanke ist, dass ich irgendetwas schreiben müsste, was sozusagen das ausführt, was ich per Hand mache. Also eine Schleife, die so lange die Stimuli rückt und schiebt, bis alles passt.

Ist so etwas möglich?

Grüße

Andreas
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Forum-Meister
Forum-Meister

Beiträge: 593
Anmeldedatum: 04.11.11
Wohnort: ---
Version: R2011a
     Beitrag Verfasst am: 31.01.2012, 16:38     Titel:
  Antworten mit Zitat      
also ich würde es versuchen so zu lösen...
die 30 bilder in 2 kategoriene aufteilen also 2 vektoren.
dann jeweils 3 mal alle bilder darin. und dann zihen ohne zurücklegen. quasi per random die kategorie wählen und dann den index. bild in zielvektor schieben und im quellvektor löschen. mann muss dann noch überprüfen was vorher gewählt wurde. da kann man ja 2 zählindexe einführen. wenn beide quellvektoren leer sind biste vertig.
so würde ich rangehen glaub ich
Private Nachricht senden Benutzer-Profile anzeigen
 
Doktorand
Themenstarter

Forum-Newbie
Forum-Newbie

Beiträge: 2
Anmeldedatum: 31.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.02.2012, 18:29     Titel:
  Antworten mit Zitat      
Hallo,

vielen Dank für deine Antwort. Ich habe versucht deinen Vorschlag umzusetzen und die Sequenz schrittweise zu füllen und in jedem Schritt die Quellvektoren zu verkleinern.

Das mit den Zählindizes habe ich allerdings nicht ganz verstanden. Dachtest Du dabei an die Kontrolle, dass nicht mehrmals hintereinander dieselbe Bedingung kommt?

Leider läuft mein aktuelles Script immer noch nicht rund. Das Problem ist, dass MATLAB mir zwar zu Anfang die Sequenz problemlos füllt, mit zunehmendem Platzindex in der Sequenz dann natürlich die Matrix Dimensionen überschritten werden.

Ein Gedanke von mir wäre noch, dass man die Sequenz von vorne und von hinten auffüllt...

Viele Grüße

Andreas

Code:

%% VARIABLES
clc, clear all

% Objects
objects = (1:1:20);
objects = objects(randperm(20));

% Conditions (Source vectors)
cond1 = objects(1:10);
cond1 = repmat(cond1,3,1);
cond2 = objects(11:20);
cond2 = repmat(cond2,3,1);

% Sequence (Target vector)
sequence(:,60) = zeros;

% Index
index = (1:1:60);

% Intervening stimuli
int = [6,7,8,9,10,11];

%% RANDOMIZER
i = 1;

while i == 1
    m = 1;
    n = 1;
    disp('WORK IN PROGRESS')
   
    a = rand(1,1); % random number to choose the condition
       
    if a < 0.5
        if isempty(cond1)
            m = 0;
        end
        while m == 1;
        j = 1;
        while j > 0
            place = index(j);
           
            % place the object
            if sequence(:,place:place+2) == 0
                sequence(:,place:place+2) = cond1(:,1)';
               
                % delete objects
                cond1(:,1) = []; % source vector condition 1
                for k = 1:3 % index vector
                    erase = find(index==place+(k-1));
                    index(:,erase) = [];
                end
               
                j = 0;
            else
                j = j+1;
            end
        end
        m = 0;
        end
    else
        if isempty(cond2)
            n = 0;
        end
        while n == 1;
        j = 1;
        int = int(randperm(6)); % how many intervening objects
        while j > 0
            place = index(j);
            if j > length(int)
                int = int(randperm(6)); % reshuffle
            end
           
            % place the object
            if sequence(:,place) == 0 && sequence(:,place+int(j)) == 0 && sequence(:,place+int(j)+int(j+1)) == 0
                sequence(:,place) = cond2(1,1);
                sequence(:,place+int(j)) = cond2(2,1);
                sequence(:,place+int(j)+int(j+1)) = cond2(3,1);
               
                % delete objects
                cond2(:,1) = []; % in source vector condition 2
                erase = find(index==place); % index vector
                index(:,erase) = [];
                erase = find(index==place+int(j));
                index(:,erase) = [];
                erase = find(index==place+int(j)+int(j+1));
                index(:,erase) = [];

                j = 0;
            else
                j = j+1;
            end
        end
        n = 0;
        end
    end
    if isempty(cond1)
        m = 0;
    end
    if isempty(cond2)
        n = 0;
    end
    if isempty(cond1) && isempty(cond2)
        i = 0;
    end
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Options and Permissions
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de goPCB.de


 Impressum  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2012 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.