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

komplizierte Randomisierung

 

Doktorand
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 31.01.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.01.2012, 15: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
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 31.01.2012, 15: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, 17: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



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.