Arrays Perl:数组到方法和返回

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

我提出了一些方法。计算质心,根据质心平移矩阵。质心的计算工作正常。x、 y和z值都很好。但是,我在translatematrix操作子方法中传递和返回数组时遇到问题。本质上,translatematrix操作返回(\@translatematrix),我无法访问调用子方法的另一个方法中的元素。这里有什么问题

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操作
不是很好描述