Arrays Perl:数组到方法和返回
我提出了一些方法。计算质心,根据质心平移矩阵。质心的计算工作正常。x、 y和z值都很好。但是,我在translatematrix操作子方法中传递和返回数组时遇到问题。本质上,translatematrix操作返回(\@translatematrix),我无法访问调用子方法的另一个方法中的元素。这里有什么问题Arrays Perl:数组到方法和返回,arrays,perl,Arrays,Perl,我提出了一些方法。计算质心,根据质心平移矩阵。质心的计算工作正常。x、 y和z值都很好。但是,我在translatematrix操作子方法中传递和返回数组时遇到问题。本质上,translatematrix操作返回(\@translatematrix),我无法访问调用子方法的另一个方法中的元素。这里有什么问题 my @ref = calculateCenterMass(@matrix); my $x = $ref[0]; my $y = $ref[1]; my $z = $ref[2]; prin
my @ref = calculateCenterMass(@matrix);
my $x = $ref[0];
my $y = $ref[1];
my $z = $ref[2];
print "Center of Mass for Matrix Above\n";
printf("X:%.3f,Y:%.3f,Z:%.3f\n\n",$x,$y,$z);
my @tempMatrix = translateMatrixOperation($x,$y,$z,\@matrix);
-----------------------------------------
sub translateMatrixOperation
{
my ($x, $y, $z, $translatematrix) = @_;
my $arrsize = @$translatematrix;
for(my $i = 0; $i < $arrsize; $i++)
{
for(my $j = 0; $j < $arrsize; $j++)
{
if ($j == 0)
{
$translatematrix->[$i][$j] -= $x;
}
elsif ($j == 1)
{
$translatematrix->[$i][$j] -= $y;
}
elsif ($j == 2)
{
$translatematrix->[$i][$j] -= $z;
}
}
}
return (\@translatematrix);
my@ref=calculateCenter(@matrix);
my$x=$ref[0];
my$y=$ref[1];
my$z=$ref[2];
打印“上面矩阵的质心\n”;
printf(“X:%.3f,Y:%.3f,Z:%.3f\n\n”,$X,$Y,$Z);
my@tempMatrix=translate矩阵运算($x,$y,$z,\@matrix);
-----------------------------------------
子平移三叉运算
{
我的($x,$y,$z,$translatematrix)=@;
我的$arrsize=@$translatematrix;
对于(我的$i=0;$i<$arrsize;$i++)
{
对于(我的$j=0;$j<$arrsize;$j++)
{
如果($j==0)
{
$translatematrix->[$i][$j]=$x;
}
elsif($j==1)
{
$translatematrix->[$i][$j]=$y;
}
elsif($j==2)
{
$translatematrix->[$i][$j]=$z;
}
}
}
返回(\@translatematrix);
}子例程返回对数组的引用。您正在将结果存储在数组@tempMatrix中。因此,整个矩阵存储在
$tempMatrix[0]
中
这可能不是你想要的。如果子例程返回引用,请使用标量变量保留它,或在将结果赋给数组之前取消引用它:
my $array_ref = translateMatrixOperation($x,$y,$z,\@matrix);
my @array = @{ translateMatrixOperation($x,$y,$z,\@matrix) };
后一个选项速度较慢,内存更密集,因为必须复制数组。子例程返回对数组的引用。您正在将结果存储在数组@tempMatrix中。因此,整个矩阵存储在
$tempMatrix[0]
中
这可能不是你想要的。如果子例程返回引用,请使用标量变量保留它,或在将结果赋给数组之前取消引用它:
my $array_ref = translateMatrixOperation($x,$y,$z,\@matrix);
my @array = @{ translateMatrixOperation($x,$y,$z,\@matrix) };
后一个选项速度较慢,内存更密集,因为必须复制数组。返回数组引用的选择通常取决于大小 如果您要传输小型阵列,我只需使用以下代码编写:
return @translatematrix;
如果传输大数组(大到足以影响性能),那么我可能会考虑返回引用。
我不确定你是否应该称它们为矩阵,因为它们似乎是一个数组。这将更容易思考无论如何,您的代码非常冗长,而且很可能是错误的
- 它在不需要循环时使用C风格 循环通常更快,并且它们更明确地说明它们在循环什么
- 它在内部数组上循环,即使您几乎总是恰好更改其中的3个值
- 内部for循环使用外部数组的长度,而不是内部数组的长度
如果外循环的元素少于3个,则这是一个问题。
这还意味着,当外部数组很大时,代码会花费大量时间无所事事 这也是使用循环的另一个原因,您不能让它的测试部分出错 - 可以修改原始数组的元素
- 您返回一个对一个数组的引用,而该数组在子例程中并没有实际使用
我只能假设您没有
使用strict代码>和
使用警告代码>中,或者您已在代码的其他地方声明了
@translatematrix
my $tempMatrix = translateMatrixOperation( $x, $y, $z, @matrix );
sub translateMatrixOperation {
my ($x, $y, $z, @coord) = @_;
# This is here in case you give it an array reference like you did before.
# It is quite fragile, you should remove it if you don't need it.
if( 1
and @coord == 1
and ref( my $aref = $coord[0] ) eq 'ARRAY'
and ref($aref->[0]) eq 'ARRAY'
){
@coord = @$aref;
}
# create a new list
my @return = map{
# of a new array refs based on the old ones
[ $_->[0] - $x, $_->[1] - $y, $_->[2] - $z, @$_[3..$#$_] ]
# the @$_[3..$#$_] part may be unnecessary
# it should be removed if that is the case
} @coord;
return @return if wantarray;
return \@return;
}
如果你去掉我认为你不需要的部分,它会变得很短
my $tempMatrix = translateMatrixOperation( $x, $y, $z, @matrix );
sub translateMatrixOperation {
my ($x, $y, $z, @coords) = @_;
my @return = map{
[ $_->[0] - $x, $_->[1] - $y, $_->[2] - $z ]
} @coords;
return @return if wantarray;
return \@return;
}
您还应该为它找到一个更好的名称,
translateMatrixOperation
不是很具有描述性。返回数组引用的选择通常取决于大小
如果您要传输小型阵列,我只需使用以下代码编写:
return @translatematrix;
如果传输大数组(大到足以影响性能),那么我可能会考虑返回引用。
我不确定你是否应该称它们为矩阵,因为它们似乎是一个数组。这将更容易思考无论如何,您的代码非常冗长,而且很可能是错误的
- 它在不需要循环时使用C风格 循环通常更快,并且它们更明确地说明它们在循环什么
- 它在内部数组上循环,即使您几乎总是恰好更改其中的3个值
- 内部for循环使用外部数组的长度,而不是内部数组的长度
如果外循环的元素少于3个,则这是一个问题。
这还意味着,当外部数组很大时,代码会花费大量时间无所事事 这也是使用循环的另一个原因,您不能让它的测试部分出错 - 可以修改原始数组的元素
- 您返回一个对一个数组的引用,而该数组在子例程中并没有实际使用
我只能假设您没有
使用strict代码>和
使用警告代码>中,或者您已在代码的其他地方声明了
@translatematrix
my $tempMatrix = translateMatrixOperation( $x, $y, $z, @matrix );
sub translateMatrixOperation {
my ($x, $y, $z, @coord) = @_;
# This is here in case you give it an array reference like you did before.
# It is quite fragile, you should remove it if you don't need it.
if( 1
and @coord == 1
and ref( my $aref = $coord[0] ) eq 'ARRAY'
and ref($aref->[0]) eq 'ARRAY'
){
@coord = @$aref;
}
# create a new list
my @return = map{
# of a new array refs based on the old ones
[ $_->[0] - $x, $_->[1] - $y, $_->[2] - $z, @$_[3..$#$_] ]
# the @$_[3..$#$_] part may be unnecessary
# it should be removed if that is the case
} @coord;
return @return if wantarray;
return \@return;
}
如果你去掉我认为你不需要的部分,它会变得很短
my $tempMatrix = translateMatrixOperation( $x, $y, $z, @matrix );
sub translateMatrixOperation {
my ($x, $y, $z, @coords) = @_;
my @return = map{
[ $_->[0] - $x, $_->[1] - $y, $_->[2] - $z ]
} @coords;
return @return if wantarray;
return \@return;
}
您还应该为它找到一个更好的名称,translateMatrix操作
不是很好描述