Matlab und / in Java

Darokh

Mitglied
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:

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...
 
Naja, ich bringe mir gerade selbst Java bei und nutze Java auch für meine Dissertation...wenn ich mir nun auch noch Python anschaue, wird das zeitlich natürlich alles noch enger. Und ich denke mal, man kann nicht Python Code in Java nutzen, oder? ...
 
Ich habs selber noch nicht ausprobiert, aber das hier wäre wohl ein Weg:

The Jython Project

Ich habe halt in meinem Studium so die Erfahrung gemacht, das Python sehr ähnlich zu Matlab ist und sehr viele Mathematische Funktionen von Haus aus mitliefert, darunter halt auch Vektoren, Matrizen, Interpolationsfunktionen etc.

Will dich jetzt aber auch nicht auf eine falsche Fährte bringen, nur evtl. kommst du damit schneller zu einem brauchbaren Ergebnis.
 
Einen Versuch ist es ja schoneinmal wert 🙂
Im Prinzip ist das Problem ja auch (nur), dass in Java die mathematischen Funktionen nicht zur Verfügung gestellt werden und ich die alle per Hand schreiben muss...und das an sich ja quatsch, weil das ja überall schon (eigentlich) rumfliegt.

Auf jeden Fall danke, das schaue ich mir jetzt direkt mal an.

Ansonsten: Hat jemand noch eine Alternative, falls das hier nicht klappt?
 
Ok...also das werde ich wohl definitiv nicht hinbekommen mit tjyphon....

Gibt es denn kein Package oder ähnliches, was mathematische Funktionen zur Verfügung stellt? Es wird doch nicht jeder wieder das Rad von neuem erfinden, wenn mal irgendetwas anspruchsvolleres benötigt wird.
 
So weit so gut...implementiert und "verstanden" wie die Sache geht, habe ich schonmal.
Nun ist nur noch die Frage, was das äquivalent von "interp1" in JScience darstellst. Mathe müsste man studiert haben...
 
Jo, das hab ich mir schon angeschaut - bin da aber irritiert. In Matlab übergebe ich interp1 3 Parameter.
In der von dir vorgeschlagenen Funktion sind es aber nur 2.

Mal davon abgesehen, dass die Parameter, die ich verwende (ich übernehme ja eine feste Struktur...) / verwendet werden, jeweils nur einen Wert besitzen. Also übergebe ich an sich nichteinmal 3 Vektoren, sondern 3 einzelne Werte.

Code:
q.xThreshold=interp1(q.p2(index),q.x2(index),q.pThreshold);

Da verstehe ich nun nicht wirklich, wie ich das auf die Apache Math Geschichte übertragen soll...
 
Hm, wenn du bei interp1 eine lineare Interpolation anwenden willst, kannst du dir das zur Not auch selber basteln, dafür muss man keine Mathematik studiert haben, die Befähigung zu einer Diss sollte ausreichen 😉 Bei Interpolation (Mathematik) ? Wikipedia steht z.B. eine Formel. Die Werte f0, f1, x0, x1 schlummern in den ersten beiden Argumenten von interp1 und x ist das dritte. Damit bekommst du dann f(x), wenn ich mich richtig an MatLab erinnere.

Aber MatLab bietet doch auch eine Schnittstelle zu Java, oder willst du gänzlich auch MatLab verzichten?
 
Hi,
schonmal danke 🙂 Also auf Matlab möchte ich gerne verzichten, da die Berechnungen (letztendlich) relativ simpel sind und ich sie auch dynamisch werde gestalten müssen. Die Laptops, die wir für die Studien verwenden werden, sind parallel dazu recht lahm - ich habe da die Befürchtung, dass mir einfach alles um die Ohren fliegt, wenn Matlab da auch noch involviert ist.

Zumal habe ich mir die m File von interp1 angeschaut und ich verstehe gar nicht, was da passiert - ergo weiß ich auch nicht, was genau ich nachbauen soll und ob die von mir dann selbstständig nachgeschlagene Interpolation auch das selbe macht, was Matlab macht, verstehst du?
 

Zurück
Oben