如何从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]
]