2016-04-07 6 views
0

Wenn ich eine NXP Matrix G und und PX1 Vektor Lambda ich dies in R tun könnenPort-R-Expression in MATLAB

G = matrix(c(1/2,1/4,3/4,5/2),nrow=2,ncol=2,byrow=TRUE) 
Lambda = c(1,2) 
M = t(G)%*%(c((1/(1+G%*%Lambda)^(2)))*G) 
M 
      [,1]  [,2] 
[1,] -0.07484568 -0.07240226 
[2,] -0.07240226 -0.15279921 

Und ich bekomme eine PxP Matrix, das ist, was ich will. Aber in Matlab, ist dies das Beste, was ich Figur könnte aus so etwas wie

b=1./((1+G*Lambda).^2) 
transpose(G(i,:))*G(i,:)*b(i) 

tut und Schleifen über diese Idee. Aber ich möchte eine Simulationsstudie machen und würde einen vektorisierten Weg bevorzugen. Wenn mir jemand helfen könnte, das herauszufinden, wäre ich sehr glücklich.

+0

Bitte etwas reproduzierbares Beispiel zeigen. – akrun

+0

Können Sie einige Eingabe- und Ausgabedaten für Ihren R-Ausdruck posten? Und eine Erklärung, was dein Code tut. – Dan

+0

@akrun Da die Dimensionen der Matrizen angegeben sind, denke ich, ist die Frage klar. Es hängt nicht von den bestimmten Werten ab. – Arpi

Antwort

1

Ich glaube, dass Matlab Vektorelemente nicht wiederverwenden kann, wenn Dimensionen nicht übereinstimmen, daher ist die Lösung etwas komplizierter.

n = 2; 
p = 4; 

G = reshape(1:(n*p), [n, p]); 
Lambda = (1:p).'; 

A = (1./(1+G*Lambda).^(2)); 
% since Matlab cannot reuse the vector elements if dimensions mismatch as R 
B = reshape(repmat(A,p,1).*G(:), size(G)); 
G.'*B 

Sie können auch einen Einstrich aus dem obigen Code erstellen. Ich finde immer noch den Weg, wie Matlab Operationen intuitiver behandelt, im Einklang mit der Mathematik.

EDIT: basierend auf @ Dan Vorschlägen:

bessere Lösung B zu erhalten:

B = bsxfun(@times, A, G); 
+1

Ich bin nicht 100% was du ' Versuchen Sie es hier, aber Ihre "Wiederverwendung von Vektorelementen, wenn Dimensionen nicht übereinstimmen" wird oft als Broadcasting bezeichnet und in MATLAB ist es im Allgemeinen besser, 'bsxfun' als' repmat' zu verwenden: 'B = bsxfun (@times, A, G);'. Möglicherweise müssen Sie dort "A" transponieren, ich habe die Abmessungen nicht überprüft. – Dan

+1

@Dan Danke für die Informationen bezüglich Rundfunk. Sie haben recht, es ist effizienter mit 'bsxfun'. Die Antwort wurde mit deinem Vorschlag aktualisiert. – Arpi

+0

Dies ist eine sehr clevere Lösung. Danke, Arpi! –