0

Perl の map 関数について助けが必要です。配列が壊れているようです。

#!/usr/bin/perl

use Math::Trig;

my @Degre = map {rand(360)} (1..2000);
my @step= map {rand(.5)} (1..2000);
my @aa = map {rand(2000)} (1..2000);
my @bb = map {rand(2000)} (1..2000);

for ($i = 0; $i <=100; $i++)

{
my @xx = map {$aa[$_]*(cos($Degre[$_])*(pi/180))}(1..2000);
my @yy = map {$bb[$_]*(cos($Degre[$_])*(pi/180))}(1..2000);

@Degre = map {@Degre[$_] + @step[$_]} (1..2000);


print "@bb[1]  @aa[1]  @Degre[1] @step[1] \n";
}

今、これの出力は

1146.56471948439  1909.33326800968  329.443529905881 0.117635819122725
1146.56471948439  1909.33326800968  343.482356802257 0.117635819122725
1146.56471948439  1909.33326800968  164.500200570578 0.117635819122725
1146.56471948439  1909.33326800968  252.734665366625 0.117635819122725
1146.56471948439  1909.33326800968  274.983382178209 0.117635819122725
1146.56471948439  1909.33326800968  324.609187610893 0.117635819122725
1146.56471948439  1909.33326800968  261.96207333817 0.117635819122725
1146.56471948439  1909.33326800968  279.442105351764 0.117635819122725

3 番目の列が度数であるため、0.117635 ..... ステップで増加すると予想していたときに、ランダムにジャンプするように見える理由がわかりません。

乾杯

アップデート

確認するために、マップステートメントで次のことを実行しようとしています

for ($x = 0; $x <=2000; $x++)
{

$degre[$x] = $degre[$x] + $step[$i]
}

コードを変更する

for ($i = 0; $i <=100; $i++)

{
my @xx = map {$aa[$_]*(cos($Degre[$_])*(pi/180))}(1..2000);
my @yy = map {$bb[$_]*(cos($Degre[$_])*(pi/180))}(1..2000);

#@Degre = map {$Degre[$_] + $step[$_]} (1..2000);
for ($x = 0; $x <=2000; $x++)

{
$Degre[$x] = $Degre[$x] + $step[$x];
}

次の出力が得られます

738.346205775827  646.171091419262  395.07480695473 0.484472140779317
738.346205775827  646.171091419262  395.559279095509 0.484472140779317
738.346205775827  646.171091419262  396.043751236288 0.484472140779317
738.346205775827  646.171091419262  396.528223377068 0.484472140779317
738.346205775827  646.171091419262  397.012695517847 0.484472140779317
738.346205775827  646.171091419262  397.497167658626 0.484472140779317
738.346205775827  646.171091419262  397.981639799406 0.484472140779317
738.346205775827  646.171091419262  398.466111940185 0.484472140779317

ループを考えるたびに、次数の列がステップ値によって正しくインクリメントされるようになりました。では、なぜ map は同じことをしないのでしょうか。

4

3 に答える 3

3

asと変更されないまま@Degreになるたびに、ループ内で変更されます。aa bbstep

  print "$aa[1]  $bb[1]  $Degre[1] $step[1] \n";

上記は、で計算された正しい値を示しています

 @Degre = map {$Degre[$_] + $step[$_]} (1..2000);

@xxandの代わりにprint@yyステートメントで@aaandを印刷し@bb、計算に従って値が変化することを確認します。

ループの@Degre=sort(@Degre);直前にa を置き、結果を確認します。for以下は、ソート後の結果です-

1726.50146484375  681.5185546875  0.624771118164063 0.456436157226563 
1726.50146484375  681.5185546875  1.15629577636719 0.456436157226563 
1726.50146484375  681.5185546875  1.7493896484375 0.456436157226563 
1726.50146484375  681.5185546875  2.49296569824219 0.456436157226563 
1726.50146484375  681.5185546875  2.861083984375 0.456436157226563 
1726.50146484375  681.5185546875  3.20767211914063 0.456436157226563 
1726.50146484375  681.5185546875  3.44265747070313 0.456436157226563 
1726.50146484375  681.5185546875  11.8232574462891 0.456436157226563 
1726.50146484375  681.5185546875  12.2711944580078 0.456436157226563 
1726.50146484375  681.5185546875  12.3104858398438 0.456436157226563 
1726.50146484375  681.5185546875  13.2642059326172 0.456436157226563 
1726.50146484375  681.5185546875  13.4784698486328 0.456436157226563 
1726.50146484375  681.5185546875  103.224014282227 0.456436157226563 
1726.50146484375  681.5185546875  103.868133544922 0.456436157226563 
1726.50146484375  681.5185546875  104.103759765625 0.456436157226563 
1726.50146484375  681.5185546875  104.71240234375 0.456436157226563 

ご覧のとおり、計算は正しいです。つまり、最初の行の0.624771118164063 + 0.456436157226563データ1.15629577636719は 2 番目の行のデータなどです。

ただし、ある時点でから3.44265747070313へのジャンプがあります。11.8232574462891なぜそれが起こっているのかはわかりませんが、特定の時点でインデックス作成がうまくいかないというのが私の推測です。これは、以下のコードを使用して解決されます

@Degre = map {$Degre[$_] + $step[$_]} (0..@step-1);

今回の出力は、3 番目の列でより一貫しています。

1139.18230471501  192.716943394942  183.715442551381 0.45937396317494 
1139.18230471501  192.716943394942  184.174816514556 0.45937396317494 
1139.18230471501  192.716943394942  184.634190477731 0.45937396317494 
1139.18230471501  192.716943394942  185.093564440906 0.45937396317494 
1139.18230471501  192.716943394942  185.552938404081 0.45937396317494 
1139.18230471501  192.716943394942  186.012312367256 0.45937396317494 
1139.18230471501  192.716943394942  186.471686330431 0.45937396317494 
1139.18230471501  192.716943394942  186.931060293605 0.45937396317494 
1139.18230471501  192.716943394942  187.39043425678 0.45937396317494 
1139.18230471501  192.716943394942  187.849808219955 0.45937396317494 
1139.18230471501  192.716943394942  188.30918218313 0.45937396317494 
于 2012-08-08T22:16:56.227 に答える
3

追加後

use strict;
use warnings;

私はかなり異なる出力を得ました:

Scalar value @Degre[$_] better written as $Degre[$_] at test3 line 20.
Scalar value @step[$_] better written as $step[$_] at test3 line 20.
Scalar value @bb[1] better written as $bb[1] at test3 line 23.
Scalar value @aa[1] better written as $aa[1] at test3 line 23.
Scalar value @Degre[1] better written as $Degre[1] at test3 line 23.
Scalar value @step[1] better written as $step[1] at test3 line 23.
Global symbol "$i" requires explicit package name at test3 line 14.
Global symbol "$i" requires explicit package name at test3 line 14.
Global symbol "$i" requires explicit package name at test3 line 14.
Execution of test3 aborted due to compilation errors.
于 2012-08-08T22:18:55.817 に答える
1

$ を意味するところに @ があると思います。

@Degre = map {@Degre[$_] + @step[$_]} (1..2000);

@Degre と @step の要素にアクセスしようとしている場合は、 $Degre[$_] などが必要です。

@xx/yy が何に使われているかはわかりません。使用されていないようです。

于 2012-08-08T22:15:57.290 に答える