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 ! 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!!!
for i = 1:length(obj) ifcond(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 elseifcond(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.
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
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...
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
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.