Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Perl中的标准输入构建2D矩阵?_Perl_Arrays_Matrix_2d - Fatal编程技术网

如何从Perl中的标准输入构建2D矩阵?

如何从Perl中的标准输入构建2D矩阵?,perl,arrays,matrix,2d,Perl,Arrays,Matrix,2d,好吧,我整个周末都在努力解决这个问题,我得到了很多帮助,但我还是没有得到。这是我到目前为止的代码:我想做的是从用户输入构建一些矩阵。最终我想把它们放大。另一个故事 投入如下 1 2 2 4 4 5 6 6 1 2 2 3 1 2 2 3 sub makeMatrix { my ($input) = @_; my @mat; while (<$input>) { if ($input eq ""){ print "it's blank\n";

好吧,我整个周末都在努力解决这个问题,我得到了很多帮助,但我还是没有得到。这是我到目前为止的代码:我想做的是从用户输入构建一些矩阵。最终我想把它们放大。另一个故事

投入如下

1 2 2 4
4 5 6 6

1 2 2 3
1 2 2 3

sub makeMatrix {
  my ($input) = @_;
  my @mat;
  while (<$input>) {
    if ($input eq ""){
        print "it's blank\n";
        return;
    }
    else{
        push @mat, [ split ];
    }
    return \@mat;
    }
}

my @a = ();
while($a = <>) {
    chomp $a;
    push @a,($a);
    }


@matrices;
push @mat, (makeMatrix(@a));

foreach $input (@matrices){
    print "input was $input\n";

}
1 2 4
4 5 6 6
1 2 2 3
1 2 2 3
子生成矩阵{
我的($input)=@;
我的@mat;
而(){
如果($input eq“”){
打印“它是空白的\n”;
回来
}
否则{
按@mat,[split];
}
返回\@mat;
}
}
我的@a=();
而($a=){
大口一美元;
按@a,($a);
}
@矩阵;
按@mat,(makeMatrix(@a));
foreach$input(@matrix){
打印“输入为$input\n”;
}

为什么这样不行?为什么它不在
@matrix
中创建矩阵数组?是子程序中的
return
语句吗?我的目标是在矩阵数组中有两个矩阵。谢谢您的帮助。

您似乎对运算符的含义有点困惑

线路

while (<$input>)
但是,您只能在例程中使用
@a
的第一个值。例行程序应如下所示:

makeMatrix(@a)
use warnings;
use strict;

sub makeMatrix {
    my @inputs = @_;
    my @mat;
    for my $input (@inputs) {
        # print "$input\n"; # debugging code left here for artistic effect
        if ($input eq "") {
            print "it's blank\n";
        }
        else{
            push @mat, [ split /\s+/, $input ];
        }
    }
    return \@mat;
}

my @a;

while ($a = <>) {
    chomp $a;
    push @a, $a;
}


my $matrices = makeMatrix (@a);

for my $row (@$matrices){
    for my $column (@$row) {
        print "input was $column\n";
    }
}
使用警告;
严格使用;
子生成矩阵{
我的@inputs=@;
我的@mat;
对于我的$input(@inputs){
#打印“$input\n”#调试代码保留在此处以获得艺术效果
如果($input eq“”){
打印“它是空白的\n”;
}
否则{
按@mat,[split/\s+/,$input];
}
}
返回\@mat;
}
我的@a;
而($a=){
大口一美元;
推动@a$a;
}
my$matrix=makeMatrix(@a);
对于我的$行(@$矩阵){
对于我的$列(@$行){
打印“输入为$column\n”;
}
}

您传递了
makeMatrix
一个字符串数组,但函数假装传递了一个文件句柄

我不知道你为什么要跳过这么多的障碍,但这是你的代码的大问题

另外,如果将一个真正的文件句柄传递给
makeMatrix
,则该行

while (<$input>) {
   if ($input eq ""){
将始终为false,因为
$input
将是一个文件句柄(因此不等于空字符串)。此外,即使你写得正确

   if ($_ eq ""){
遇到空行时,该条件将为false,因为您没有
chomp
离开行尾(
$\uu
不会为空)

总之,这是一堆乱七八糟的代码,读者只能试着猜测你想做什么。想一想你想完成什么,并更好地解释一下

有很多学习Perl的资源

下面的代码非常晦涩,我不建议在生产中使用它,但尝试弄清楚它的作用可能会教会您很多东西:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

while ( my $matrix = read_matrix() ) {
    print Dumper $matrix;
}

sub read_matrix {
    local $/ = "\n\n";
    return if eof DATA;
    return [ map { [ split ] } split /\n/, scalar <DATA> ];
}

__DATA__
1 2 2 4
4 5 6 6

1 2 2 3
1 2 2 3
#/usr/bin/perl
严格使用;
使用警告;
使用数据::转储程序;
而(my$matrix=read_matrix()){
打印转储程序$matrix;
}
子读取矩阵{
本地$/=“\n\n”;
如果返回eof数据;
返回[map{[split]}split/\n/,scalar];
}
__资料__
1 2 2 4
4 5 6 6
1 2 2 3
1 2 2 3
输出:

$VAR1 = [ [ '1', '2', '2', '4' ], [ '4', '5', '6', '6' ] ]; $VAR1 = [ [ '1', '2', '2', '3' ], [ '1', '2', '2', '3' ] ]; $VAR1=[ [ '1', '2', '2', '4' ], [ '4', '5', '6', '6' ] ]; $VAR1=[ [ '1', '2', '2', '3' ], [ '1', '2', '2', '3' ] ];
马特,请检查我在下面写的内容,看看我是否理解这个问题:

我的要点是:

(1) 您的示例数据对于矩阵乘法不太有效。如果第一个数组是2x4,那么第二个数组必须是4x2,答案将是2x2

(2) Perl为您提供了一种非常强大的数据语言(PDL),它在矩阵操作方面非常有效。如果你要做很多矩阵代数,我建议你用它

(3) 根据下面的解决方案,如果您先将数据读入2D数组(AoA是数组数组),矩阵产品将分3行显示


@基诺皮科:他是这么说的。你认为需要澄清什么?它在回答中说“输入是一个文件句柄”。你已经问过这个问题:是的,但是我不能让它起作用。我不明白这个意思。我真的很想理解它。看起来你需要先学习语言的基础知识。你已经有一本书了吗?把你的问题缩小到不适合你的部分。您试图一次理解的内容太多。请注意,
split'
split/\s+/
不同。对文件进行Slurping既不必要也不可取。当数组可能很大时,将所有行作为展平数组传递是不好的做法。
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

while ( my $matrix = read_matrix() ) {
    print Dumper $matrix;
}

sub read_matrix {
    local $/ = "\n\n";
    return if eof DATA;
    return [ map { [ split ] } split /\n/, scalar <DATA> ];
}

__DATA__
1 2 2 4
4 5 6 6

1 2 2 3
1 2 2 3
$VAR1 = [ [ '1', '2', '2', '4' ], [ '4', '5', '6', '6' ] ]; $VAR1 = [ [ '1', '2', '2', '3' ], [ '1', '2', '2', '3' ] ];
#!/usr/bin/perl
use strict;
use warnings;
use PDL; # perl data language enables matrix multiplication
use Inline::Files; #multiple virtual files inside code

my @AoA_A = make_matrix("ARRAY_A"); #read in 2D array
my @AoA_B = make_matrix("ARRAY_B");

my $a = pdl [ @AoA_A ]; #Construct new pdl object
my $b = pdl [ @AoA_B ];
my $c = $a x $b;  # x overload
print "matrix a", $a;
print "matrix b", $b;
print "matrix c",$c;

sub make_matrix {
    my $source = shift;
    my @AoA;
    while (<$source>){
        my @tmp = split;
        push @AoA, [ @tmp ];
    }
    return @AoA;  
}

__ARRAY_A__
1 2 2 4
4 5 6 6
__ARRAY_B__
1 2
2 3
1 2
2 3
matrix a
[
 [1 2 2 4]
 [4 5 6 6]
]
matrix b
[
 [1 2]
 [2 3]
 [1 2]
 [2 3]
]
matrix c
[
 [15 24]
 [32 53]
]