Hi,
ich habe eine komplexe Funktion in Matlab, so genanntes "Adaptives Testen". Nun möchte ich diese Funktionen in Java implementieren. Leider stellt mir Java natürlich die von Matlab verwendeten Grundfunktionen zur Verfügung, die in Matlab aber die ganze Zeit verwendet werden. Beispielsweise Vektorrechnung oder differenzen zwischen zwei Elementen eines Vektors berechnen.
Derzeitig muss ich eine Interpolation vornehmen ("interp1" in Matlab) und bekomme sie nicht in Java-Code übertragen. Im Netz finden sich ein paar Lösungen dazu (Multigraph beispielsweise), die kann ich aber auf die Anwendung in Matlab nicht übertragen.
Hier mal ein Beispielcode aus Matlab:
Habt ihr irgendeine Idee, wie ich den Matlab Code in Java bekomme bzw. wie ich zumindest eine Interpolation (interp1) rechnen kann, wie sie hier in dem Beispiel verwendet wird? Dort weden nämlich (anscheinend) keine Vektoren übergeben, sondern nur jeweils ein einzelner Wert - da spackt mir dann aber das Multigraph Package ab...
ich habe eine komplexe Funktion in Matlab, so genanntes "Adaptives Testen". Nun möchte ich diese Funktionen in Java implementieren. Leider stellt mir Java natürlich die von Matlab verwendeten Grundfunktionen zur Verfügung, die in Matlab aber die ganze Zeit verwendet werden. Beispielsweise Vektorrechnung oder differenzen zwischen zwei Elementen eines Vektors berechnen.
Derzeitig muss ich eine Interpolation vornehmen ("interp1" in Matlab) und bekomme sie nicht in Java-Code übertragen. Im Netz finden sich ein paar Lösungen dazu (Multigraph beispielsweise), die kann ich aber auf die Anwendung in Matlab nicht übertragen.
Hier mal ein Beispielcode aus Matlab:
Code:
if nargin~=1
error('Usage: q=QuestRecompute(q)')
end
if length(q)>1
for i=1:length(q(:))
q(i).normalizePdf=0; % any norming must be done across the whole set of pdfs, because it's actually one big multi-dimensional pdf.
q(i)=QuestRecompute(q(i));
end
return
end
if ~q.updatePdf
return
end
if q.gamma>q.pThreshold
warning(sprintf('reducing gamma from %.2f to 0.5',q.gamma))
q.gamma=0.5;
end
% prepare all the arrays
q.i=-q.dim/2:q.dim/2;
q.x=q.i*q.grain;
q.pdf=exp(-0.5*(q.x/q.tGuessSd).^2);
q.pdf=q.pdf/sum(q.pdf);
i2=-q.dim:q.dim;
q.x2=i2*q.grain;
q.p2=q.delta*q.gamma+(1-q.delta)*(1-(1-q.gamma)*exp(-10.^(q.beta*q.x2)));
if q.p2(1)>=q.pThreshold | q.p2(end)<=q.pThreshold
error(sprintf('psychometric function range [%.2f %.2f] omits %.2f threshold',q.p2(1),q.p2(end),q.pThreshold))
end
if any(~isfinite(q.p2))
error('psychometric function p2 is not finite')
end
index=find(diff(q.p2)); % subset that is strictly monotonic
if length(index)<2
error(sprintf('psychometric function has only %g strictly monotonic point(s)',length(index)))
end
q.xThreshold=interp1(q.p2(index),q.x2(index),q.pThreshold);
if ~isfinite(q.xThreshold)
q
error(sprintf('psychometric function has no %.2f threshold',q.pThreshold))
end
q.p2=q.delta*q.gamma+(1-q.delta)*(1-(1-q.gamma)*exp(-10.^(q.beta*(q.x2+q.xThreshold))));
if any(~isfinite(q.p2))
q
error('psychometric function p2 is not finite')
end
q.s2=fliplr([1-q.p2;q.p2]);
if ~isfield(q,'intensity') | ~isfield(q,'response')
q.intensity=[];
q.response=[];
end
if any(~isfinite(q.s2(:)))
error('psychometric function s2 is not finite')
end
% Best quantileOrder depends only on min and max of psychometric function.
% For 2-interval forced choice, if pL=0.5 and pH=1 then best quantileOrder=0.60
% We write x*log(x+eps) in place of x*log(x) to get zero instead of NaN when x is zero.
pL=q.p2(1);
pH=q.p2(size(q.p2,2));
pE=pH*log(pH+eps)-pL*log(pL+eps)+(1-pH+eps)*log(1-pH+eps)-(1-pL+eps)*log(1-pL+eps);
pE=1/(1+exp(pE/(pL-pH)));
q.quantileOrder=(pE-pL)/(pH-pL);
if any(~isfinite(q.pdf))
error('prior pdf is not finite')
end
% recompute the pdf from the historical record of trials
for k=1:length(q.intensity)
inten=max(-1e10,min(1e10,q.intensity(k))); % make intensity finite
ii=size(q.pdf,2)+q.i-round((inten-q.tGuess)/q.grain);
if ii(1)<1
ii=ii+1-ii(1);
end
if ii(end)>size(q.s2,2)
ii=ii+size(q.s2,2)-ii(end);
end
q.pdf=q.pdf.*q.s2(q.response(k)+1,ii); % 4 ms
if q.normalizePdf & mod(k,100)==0
q.pdf=q.pdf/sum(q.pdf); % avoid underflow; keep the pdf normalized % 3 ms
end
end
if q.normalizePdf
q.pdf=q.pdf/sum(q.pdf); % keep the pdf normalized % 3 ms
end
if any(~isfinite(q.pdf))
error('pdf is not finite')
end
Habt ihr irgendeine Idee, wie ich den Matlab Code in Java bekomme bzw. wie ich zumindest eine Interpolation (interp1) rechnen kann, wie sie hier in dem Beispiel verwendet wird? Dort weden nämlich (anscheinend) keine Vektoren übergeben, sondern nur jeweils ein einzelner Wert - da spackt mir dann aber das Multigraph Package ab...