プログラミングが得意な方お願いします。
下図のリンクのページランクをPerlで実装したいのですが、
まずPDLモジュールをダウンロードし、リンク隣接行列を下記のように定義しました。
use PDL::Lite;
my $mat1 = pdl [
[0, 1, 1/2, 0, 1/4, 1/2, 0],
[1/5, 0, 1/2, 1/3, 0, 0, 0],
[1/5, 0, 0, 1/3, 1/4, 0, 0],
[1/5, 0, 0, 0, 1/4, 0, 0],
[1/5, 0, 0, 1/3, 0, 1/2, 1],
[0, 0, 0, 0, 1/4, 0, 0],
[1/5, 0, 0, 0, 0, 0, 0]
];
そして下記の列ベクトルと上記の行列をかけてその答えと上記の行列をかけてさらにその答えと上記の行列をかけて・・・を繰り返し、掛けても答えが変わらなくなったところでその列ベクトルの値を取り出し正規化して出力するという方法を考えました。
my $mat2 = pdl [
[1],
[1],
[1],
[1],
[1],
[1],
[1]
];
ここで質問ですが、上記の処理をwhile文で実行したいのですが掛けても答えが変わらなくなったところでwhileからループを抜ける処理はどのように書いたら良いのでしょうか?
Perlは初心者で、行列同士の比較はwhileの条件文ではできないでしょうし、列ベクトルの要素を一つ一つ比較する方法も分かりません。
以上写真のページランクをperlで取得する方法、宜しくお願い致します。
No.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)
=======================
No.3
- 回答日時:
表示がくずれるので、空白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;
}
No.1
- 回答日時:
課題なのか何なのかよくわかりませんが、
ここで聞いてバレたら面倒なことになるとは想像できないんですか?
この回答への補足
課題ではありません。
mat1×mat2を実行し、その答え(当然7行1列)にさらにmat1をかけ、その掛けた答えにさらにmat1を掛けるという動作を繰り返していくと、いずれその答えがほとんど変わらなくなります。その部分で、whileなりfor文から抜け出してその変わらなくなった答え(当然7行1列)を出力したいのです。
そのプログラムを教えて頂ければ幸いです。
PDLをダウンロードしました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Excel(エクセル) エクセルで2つの表を比較して、文字列が同じだが、その行のある値が違うものを抽出したい 1 2022/10/06 21:48
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- Visual Basic(VBA) Excel VBA マクロ ある列の最終行迄を参照し、別の列の空白セルに値を入力したいです 2 2023/03/05 02:44
- Java Java 南京錠 2 2023/02/04 11:46
- Visual Basic(VBA) Excel VBAで教えてください 4 2022/05/11 22:20
- その他(プログラミング・Web制作) パイソンのプログラミングについての質問です 2 2023/05/22 12:39
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Pythonのプログラミングの質問...
-
JSONで文字列が長い時
-
【至急!!!】python言語で本を見...
-
Application.ScreenUpdating = ...
-
文字の横にプルダウンを表示さ...
-
FindFirst を複数条件で検索
-
同じものを繰り返し表示させる
-
linuxにおけるCの自作ヘッダフ...
-
C言語:単語カウント
-
C++ コマンドプロンプトでの入...
-
perでメールが送信出来ない場合...
-
phpでボタンを押したときに変数...
-
テーブル内でドロップダウンメ...
-
フォームで入力した値を表示し...
-
Perl>「対話形式+ファイルを...
-
数値かどうかの判定方法
-
複数列を持ったリストボックス...
-
formで特定のinputを送信しない...
-
pythonで改行を含めてfindする方法
-
プルダウンメニューがプルアップに
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlで複数の値を返す良い方法...
-
HASH(0xほげほげ)
-
10進数→2進数
-
内部処理形式が日付型 (Date) ...
-
Wコロン
-
変数に値を代入するのに、まずu...
-
Perlで自分自身の関数名を知る...
-
PerlでCabochaを呼び出すには(...
-
print <<"_HTML_"の中でサブル...
-
プロトタイプ宣言のワーニング...
-
Perlで use strict して our変数
-
Pythonのマルチプロセスでの並...
-
Perl 一定時間後にプログラムを...
-
これは動いてくれますか??
-
Net::SSH::Perlについて
-
Python 点座標表示の不具合
-
引数の値をURLのパスに配列とし...
-
Pythonのプログラミングの質問...
-
Net::Telnetでタイムアウト時間...
-
[perl] next と return 同じ意...
おすすめ情報