2016-07-19 18 views
-3

Können Sie mir bitte helfen, diese Gleichung in einen Code zu übersetzen? This is the equationÜbersetzen Sie eine Gleichung in einen Code

habe ich versucht, diesen Code aber es ist nur der erste Teil

theSum = sum(M(:, y) .* S(:, y) ./ (1 + K(:, y))) 
+0

Dein erster Teil sieht etwas anders aus, Was ist in deinem ersten Teil 'S (:, y)'? 'X (z, y)/L (z, y)'? – GameOfThrows

+0

Ich denke, ich habe es falsch geschrieben, da ich ein wenig verwirrt bin –

+0

Weißt du was M (z, y)/K (z, y) bedeutet? Sind M und K Matrizen? Wenn dies Matrizen sind, dann macht dies nur, wenn es eine elementweise Teilung impliziert, aber dann ist die Gleichung mehrdeutig, weil ich nicht wissen würde, ob ich MXO und K^2 als normale Matrixmultiplikation interpretieren sollte, oder ob sie multipliziert werden sollten. weise auch ... –

Antwort

0

EDIT: sorry, ich Brainfart aufwies, wurde. Die folgende Antwort lässt keine Vermutungen über die Natur von M, K usw. zu, weshalb ich solche Funktionen empfahl. Aber sie sind eindeutig Matrizen. Ich werde eine andere Antwort machen, werde ich diese Referenz hier verlassen, obwohl, falls es sinnvoll ist

ich, indem sie die M, beginnen würde K, X, L und O Ausdrücke in einfachen Funktionen, so dass Sie leicht, sie als M(z,y) nennen, X(z,y) (oder X(z,j) am Eingang ab, die Sie benötigen) usw.

Dann konvertieren Sie jede Summe in einer for-Schleife und sammeln das Ergebnis (Sie können später über Vektorisierung denken, jetzt konzentrieren sich auf das übersetzen das Problem). Die Doppelsummierung ist im Wesentlichen eine verschachtelte For-Schleife, wobei das Ergebnis der inneren Schleife bei jeder äußeren Iteration in der äußeren verwendet wird.

Also Ihr Endergebnis sollte ungefähr so ​​aussehen:

Summation1 = 0; 
for z = 1 : Z 
    tmp = M(z,y)/K(z,y) * (X(z,y)/(1 + L(z,y)); 
    Summation1 = Summation1 + tmp; 
end 

Summation2 = 0; 
for j = 1 : Y 
    if j ~= y 
    for z = 1 : Z 
     tmp = (M(z,j) * X(z,j) * O(j))/(K(z,j)^2 * (1 + L(z,j)) * X(z,y); 
     Summation2 = Summation2 + tmp; 
    end 
    end 
end 

Result = Summation1 - Summation2; 

(BTW, dies setzt voraus, dass alle Operationen auf Skalare sind Wenn M(z,y) einen Vektor ausgibt, stellen für element Operationen geeignet ist.)

+0

weiter zur Vektorisierung, ich würde immer noch Funktionen verwenden, passen sie einfach entsprechend Ausgabevektoren, und ersetzen Sie die for-Schleifen durch einfache Operationen auf diesen Vektoren. –

+0

@Sassosamer: Danke, dass du das als Antwort akzeptierst, aber hast du aus Neugierde meine vektorisierte Version unten versucht? Dies ist immer noch eine nette allgemeine Herangehensweise an das Problem, aber für Ihr spezifisches Beispiel wird der vektorisierte Ansatz viel effizienter sein. –

0

IF M, K, usw. sind alle Matrizen, und alle Operationen werden erwartet, um elementweise zu sein, dann ist dies ein vektorisierter Ansatz für diese Gleichung.

Linke Summe ist

S1 = M(1:Z,y) ./ K(1:Z,y) .* X(1:Z,y) ./ (1 + L(1:Z,y)); 
S1 = sum(S1); 

rechtse Summierung wird (unter der Annahme (O ein horizontaler Vektor ist)

S2 = M(1:Z, 1:Y) .* X(1:X, 1:Y) .* repmat(O(1:Y), [Z,1]) ./ ... 
    (K(1:Z, 1:Y) .^ 2 .* (1 + L(1:Z, 1:Y))) .* X(1:Z, 1:Y); 
S2(:,y) = []; % remove the 'y' column from the matrix 
S2 = sum(S2(:)); % add all elements 

Endergebnis: S1 - S2

+0

Dotn mach noch einen, bearbeite deinen mit beiden Informationen –

+0

Danke @AnderBiguri ... SO hat mich gebeten, das auch vor dem Posten zu bestätigen; Ich fühlte, dass dies eine der Situationen war, in denen eine kurze zweite Antwort einem wirklich langen mit einem langen irrelevanten ersten Teil vorzuziehen war, besonders wenn die beiden sehr unterschiedliche Informationen vermitteln. Offensichtlich konnte ich meine erste Antwort komplett löschen, aber ich dachte, dass es für sich selbst nützlich sein könnte, also habe ich es für jetzt gelassen. –

0

diese Lambda Version vektorisiert:

equation = @(y,M,K,X,L,O) ... 
    sum(M(:,y)./K(:,y).*X(:,y)./(1+L(:,y))) ... 
    -sum(sum(... 
     bsxfun(... 
      @times ... 
      ,M(:,[1:y-1,y+1:end]) ... 
       .* X(:,[1:y-1,y+1:end]) ... 
       .* O(:,[1:y-1,y+1:end]) ... 
       ./ (K(:,[1:y-1,y+1:end]) .^ 2 ... 
       .*(1+ L(:,[1:y-1,y+1:end]))) ... 
      ,X(:,y) ... 
     ) ... 
    )); 
%%% example: 
y = 3; 
Y = 5; 
Z = 10; 
M = rand(Y, Z);K = rand(Y, Z);X = rand(Y, Z);L = rand(Y, Z);O = rand(Y, Z); 

equation(y,M,K,X,L,O)