【问题标题】:Perl power of the adjacency matrix邻接矩阵的 Perl 幂
【发布时间】:2021-12-25 18:48:58
【问题描述】:

有谁知道他们如何找到adjacency matrix 的 n 次方?

这是我要为其编写代码的矩阵

0 0 1 0    
0 0 1 0                                                                 
1 1 0 1                                                                      
0 0 1 0                                                                   

第二次幂邻接矩阵为:

 1 1 0 1                                                                    
 1 1 0 1                                                                    
 0 0 3 0                                                                    
 1 1 0 1                                                                    

我不确定如何用 perl 代码计算它 我的文件中只有一个读取代码

sub matrix_read_file {
    my ($filename) = @_;
    my @matrix;
    open (my $F, '<', $filename) or die "Could not open $filename: $!";
    while (my $line =<$F> ) {
        chomp $line;
        next if $line =~ /^\s*$/; # skip blank lines
        my @row = split /\s+/, $line;
        push @matrix, \@row;
    }
    close $F;
    print  "$matrix[2][1]\n";  #test to see if individual elements print
    print "$matrix[1][2]\n";
    return \@matrix;
}

【问题讨论】:

  • 至少包含一些代码会非常有用。例如,您如何表示您的矩阵。
  • @Shawn 我没有编写任何代码,但我输入的初始矩阵与上面完全相同的文本文件作为我读入的文本文件。我试图将第二次幂邻接矩阵作为我的输出
  • 你可以看看Math::Matrix
  • Here 是使用 PDL 的示例

标签: perl adjacency-matrix


【解决方案1】:

这是一个例子:

use v5.22.0;  # signatures requires perl >= 5.22
use feature qw(say);
use strict;
use warnings;
use experimental qw(signatures);
use Data::Dumper;
{
    my $m = [[0,0,1,0],[0,0,1,0],[1,1,0,1],[0,0,1,0]];
    my $m2 = matmul( $m, $m );
    print Dumper($m2);
}

# Assume $m1 has size [pxq] and $m2 has size [qxr]  :
#  p = number of rows in $m1
#  q = number of columns in $m1  ==  number of rows in $m2
#  r = number of columns in $m2
# result = [pxq] * [qxr] => [p x r]
sub matmul( $m1, $m2 ) {

    my $p = $#$m1;
    my $q = $#{$m1->[0]};
    my $r = $#{$m2->[0]};
    my @res;
    for my $i (0..$p) {
        for my $j (0..$r) {
            my $sum = 0;
            for my $k (0..$q) {
                $sum += $m1->[$i][$k] * $m2->[$k][$j];
            }
            $res[$i][$j] = $sum;
        }
    }
    return \@res;
}

或者,使用PDL 模块:

use feature qw(say);
use strict;
use warnings;
use PDL;
my $m = pdl [[0,0,1,0],[0,0,1,0],[1,1,0,1],[0,0,1,0]];
my $m2 = $m x $m;
print $m2;

【讨论】:

    猜你喜欢
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多