2

Таким образом, формула, которая должна быть реализована в:Как воспроизвести этот математический код для вычисления переходной матрицы pagerank на 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}]]; 

Все остальное просто затыкать в цифрах. Теперь главная проблема, с которой я, похоже, получаю: A[[i,j]]/Sum[A[i,k]] для работы над matlab.

В MATLAB: когда я ввода A[[i,j]], как А, а sum[A[i,k]] либо как (сумма (А, 2))»или сумма (А, 1), Р, который получает выходной сигнал от MATLAB становится вектор-столбец, а не 8 x 8.

Что мне не хватает?

+0

Для работы с данными я ввел его для вашей ссылки в код MATAB: '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]; 'поэтому вам не нужно делать это самостоятельно. @Kenshin: Я не профессионал в Mathematica, так что же вы хотите получить в качестве результата? Не могли бы вы вкратце объяснить, каков ожидаемый результат, т. Е. Какие значения объединены в вычислении, каким образом? EDIT: Получил это ^^ – tim

ответ

1

Существует много способов сделать это. Я покажу вам один способ использования собственного векторизованного кода MATLAB, поэтому нет необходимости в for -loops или arrayfun или что-нибудь в этом роде.

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 

Надеюсь, у меня есть желаемый выход справа.

+0

Спасибо, что сработало отлично! – Kenshin

+1

сделано, спасибо, говорит, что мне нужно 15 очков репутации, чтобы проголосовать. – Kenshin

Смежные вопросы