2012-08-08 61 views
0

我需要Perl中的map函數的一些幫助,它似乎對我的數組進行了細分。Perl映射函數沒有按預期工作

#!/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 

隨着第三列是度,我不明白爲什麼它似乎隨機左右時,我預期它在0.117635增加跳躍。 .... 腳步?

乾杯

UPDATE

爲了證實我試圖獲取地圖statment做以下

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 

正如您可以看到度數列現在每次認爲循環通過步長值正確遞增。那麼爲什麼地圖不這樣做。

+0

有一個問題line「@Degre = map {$ Degre [$ _] + $ step [$ _]}(1..2000);」超過原始數組值?或添加到數組? – DevilWAH 2012-08-08 23:02:05

+0

順便說一下,'map {}(1..2000)'是一種效率低下的做事方式,因爲它創建了一個由數字1到2000填充的2000元素的數組。for循環做同樣的事情會更有效率:'$ Degre [$ _] + = $ step [$ _](1..2000)' – dan1111 2012-08-09 14:06:59

+0

當我測試了一個for循環(使用上面我的問題中的代碼)。和長凳標記它反對使用「地圖」它顯着慢。我會再次嘗試使用您建議的代碼。乾杯:) – DevilWAH 2012-08-10 20:33:02

回答

3

您的@Degre在循環內部每次被更改,因爲aabbstep保持不變。在

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

打印@xx@yy在print語句計算的@aa@bb,而不是看值的變化情況每計算

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

上面顯示正確的值。

@Degre=sort(@Degre);放在for循環前面並查看結果。下面是sorting-

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數據等。

但是,在某個時間點有從3.4426574707031311.8232574462891的跳躍。我不確定爲什麼會發生這種情況,但我的假設是索引在某個時刻出錯了。這是使用下面

@Degre = map {$Degre[$_] + $step[$_]} ([email protected]); 

碼這一次的輸出在第三欄柱更加一致的解決

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..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 
+0

哦,我正在打印一個BB,然後只是進行測試。我想看到他們保持不變。 – DevilWAH 2012-08-08 22:52:16

+0

爲什麼我需要排序?如果$ degre [1] = 10並且$ step [1] = 5,那麼我會期望每個for循環將5 degre [1]加入到5中。所以我不明白爲什麼需要sort函數。 – DevilWAH 2012-08-08 23:00:52

+0

我剛纔說過,只是爲了看到增量的增量。沒有其他目的。 – Annjawn 2012-08-08 23:46:01

1

我認爲你已經有@你的意思是$。

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

如果您試圖訪問,那麼你想 $ Degre @Degre的元素和@step [$ _]等

我不清楚是什麼// @ XX/YY是要麼 - 他們似乎並沒有使用

+0

xx和yy指向日食。 aa和bb是日食的高度和高度。所以目前他們沒有什麼,但是這個代碼片段正在做的是生成2000年的eclipse。並使用度數值計算X,Y座標。每個循環對程度進行一定的量並重新計算這些點。 – DevilWAH 2012-08-08 22:25:49

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. 
+0

歡呼聲,我真的必須養成使用它的習慣!真的沒有理由不使用它。 – DevilWAH 2012-08-08 22:55:46