2

So ist die Formel, die umgesetzt werden muss, ist:Wie reproduziere ich diesen Mathematica-Code für die Berechnung der Übergangsmatrix von Pagerank auf Matlab?

P = ((1 - delta)/n) + ((delta)*(A)ij/(Sigma(k=1 to n)(A)ik)) 

where delta = 0.85 
n = 8 
and A = the adjacency matrix for web pages being surfed 

The mathematica code for it is: 

    A = {{1, 1, 1, 0, 0, 1, 0, 1}, {0, 0, 1, 0, 0, 1, 0, 1}, {1, 1, 0, 1, 
     0, 1, 1, 0}, {0, 1, 1, 0, 1, 0, 1, 0}, {1, 1, 1, 1, 0, 1, 1, 
     1}, {1, 1, 1, 0, 0, 1, 1, 0}, {1, 0, 1, 0, 1, 0, 1, 0}, {0, 0, 0, 
     0, 1, 0, 0, 1}}; 

     n = 8; 

     \[Delta] = 0.85; 

     P = Transpose[Table[(1 - \[Delta])/n + (\[Delta]*A[[i, j]])/(Sum[A[[i, k]], {k, 1, n}]), {i, 1, n}, {j, 1, n}]]; 

Alles andere nur in Zahlen ist einstecken. Jetzt scheint das Hauptproblem, das A[[i,j]]/Sum[A[i,k]] zu bekommen, um auf Matlab zu arbeiten.

On Matlab: wenn I-Eingang A[[i,j]] als A, und sum[A[i,k]] entweder als (sum (A, 2))‘oder die Summe (A, 1), die P, die Ausgabe auf Matlab wird ein Spaltenvektor ist, anstatt ein 8 bekommt x 8 Matrix.

Was fehlt mir?

+0

Um alle mit den Daten arbeiten, habe ich es für Ihre Referenz in MATAB-Code eingegeben: 'A = [1, 1, 1, 0, 0, 1, 0, 1; 0, 0, 1, 0, 0, 1, 0, 1; 1, 1, 0, 1, 0, 1, 1, 0; 0, 1, 1, 0, 1, 0, 1, 0; 1, 1, 1, 1, 0, 1, 1, 1; 1, 1, 1, 0, 0, 1, 1, 0; 1, 0, 1, 0, 1, 0, 1, 0; 0, 0, 0, 0, 1, 0, 0, 1]; 'damit du es nicht alleine machen musst. @ Kenshin: Ich bin kein Profi in Mathematica, also was genau willst du als Ausgang haben? Können Sie kurz erklären, was die erwartete Ausgabe ist, d. H. Welche Werte werden in einer Berechnung auf welche Weise kombiniert? EDIT: Bekam ^^ – tim

Antwort

1

Es gibt viele Möglichkeiten, dies zu tun. Ich werde Ihnen einen Weg zeigen, nativen vektorisierten MATLAB-Code zu verwenden, also keine Notwendigkeit für for -loops oder arrayfun oder etwas ähnliches.

A = [1, 1, 1, 0, 0, 1, 0, 1; 0, 0, 1, 0, 0, 1, 0, 1; 1, 1, 0, 1, 0, 1, 1, 0; 0, 1, 1, 0, 1, 0, 1, 0; 1, 1, 1, 1, 0, 1, 1, 1; 1, 1, 1, 0, 0, 1, 1, 0; 1, 0, 1, 0, 1, 0, 1, 0; 0, 0, 0, 0, 1, 0, 0, 1]; 
n = size(A, 1); 
delta = 0.85; 

% First, sum up all columns in each row 
rowSums = sum(A,2); 

% Then replicate them because the entries in each row of the vector are valid for every column in that specific row. So replicate them so that the output-matrix matches the size of A so we can work element-wise division later 
rowSums2 = repmat(rowSums, 1, n); 

% Use vectorized code, ./ will yield element-wise division as A and rowSums2 are of the same size now 
P = (1 - delta)/n + delta*A ./ rowSums2 

Ich hoffe, ich habe die gewünschte Ausgabe richtig.

+0

Danke, das hat perfekt funktioniert! – Kenshin

+1

fertig, danke, sagt, ich brauche 15 Rufpunkte, um zu wählen. – Kenshin