- ベストアンサー
Perlでページランクを取得する方法
- Perlを使用してページランクを取得する方法について教えてください。
- PDLモジュールを使用してリンク隣接行列を定義し、列ベクトルとの行列積を繰り返すことでページランクを計算します。
- while文を使用して行列積の計算を繰り返し、答えが変わらなくなったところでループを抜ける処理を書く方法を教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
use PDL::Ufunc; を追加し、次でループ脱出 if(all $ans_now == $ans_before){last;} ただし、$ans_nowは今回の演算結果, $ans_beforeは前回の演算結果 PDLのhelp allより: ======================= Module PDL::Ufunc all Return true if all elements in piddle set ...(snip) =======================
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
なんかもったいないことをしてる気がする>#3. approx とか all とか駆使すればいいような.
- _--_1l1_1_
- ベストアンサー率67% (102/152)
表示がくずれるので、空白2文字を全角空白にしていることに注意。 use feature 'say'; use PDL; my $matrix1 = pdl( [ [ 1, 2 ], [ 3, 4 ] ] ); print '--- matrix1', $matrix1; # --- matrix1 # [ # [1 2] # [3 4] # ] my $vector1 = pdl( [ [5], [6] ] ); print '--- vector1', $vector1; # --- vector1 # [ # [5] # [6] # ] my $answer = $matrix1 x $vector1; print '--- answer', $answer; # --- answer # [ # [17] # [39] # ] my $vector2 = pdl( [ [7], [8] ] ); print '--- vector2', $vector2; if ( compare_vector($vector1,$vector2) ) { say '$vector1 == $vector2'; } else { say '$vector1 != $vector2'; } # --- vector2 # [ # [7] # [8] # ] # $vector1 != $vector2 my $vector3 = pdl( [ [5], [6] ] ); print '--- vector3', $vector3; if ( compare_vector($vector1, $vector3) ) { say '$vector1 == $vector3'; } else { say '$vector1 != $vector3'; } # --- vector3 # [ # [5] # [6] # ] # $vector1 == $vector3 sub compare_vector { my $v1 = shift; my $v2 = shift; if ($v1->getndims != $v2->getndims) { return 0; } my $dims = $v1->getndims; for (my $i = 0; $i < $dims; $i++) { if ($v1->at(0, $i) != $v2->at(0, $i)) { return 0; } } return 1; }
- Tacosan
- ベストアンサー率23% (3656/15482)
えぇと.... あなたは 2つの列ベクトルが同じかどうか判断することができますか?
- _--_1l1_1_
- ベストアンサー率67% (102/152)
課題なのか何なのかよくわかりませんが、 ここで聞いてバレたら面倒なことになるとは想像できないんですか?
補足
課題ではありません。 mat1×mat2を実行し、その答え(当然7行1列)にさらにmat1をかけ、その掛けた答えにさらにmat1を掛けるという動作を繰り返していくと、いずれその答えがほとんど変わらなくなります。その部分で、whileなりfor文から抜け出してその変わらなくなった答え(当然7行1列)を出力したいのです。 そのプログラムを教えて頂ければ幸いです。 PDLをダウンロードしました。
補足
mat1×mat2を実行し、その答え(当然7行1列)にさらにmat1をかけ、その掛けた答えにさらにmat1を掛けるという動作を繰り返していくと、いずれその答えがほとんど変わらなくなります。その部分で、whileなりfor文から抜け出してその変わらなくなった答え(当然7行1列)を出力したいのです。 そのプログラムを教えて頂けたら幸いです。