2011-09-07 18 views
2
Please consider  

daList = {{{21, 18}, {20, 18}, {18, 17}, {20, 15}}, 
      {{21, 18}, {20, 18}, {21, 14}, {21, 14}}}; 

我想計算在該列表中的第2個子列出了每個點之間的距離:在數學在一定水平上應用歐幾里得距離

但我需要使用Function在正確的申請級別:

Function[seqNo, 
     EuclideanDistance[#, {0, 0}] & /@ daList[[seqNo]]] /@ 
     Range[[email protected]] 

out = {{3 Sqrt[85], 2 Sqrt[181], Sqrt[613], 25}, {3 Sqrt[85], 2 Sqrt[181], 
     7 Sqrt[13], 7 Sqrt[13]}} 

有沒有辦法避免這個沉重的功能呢? 要指定避免我的函數與seqNo作爲參數的級別? :

EuclideanDistance[#, {0, 0}] & /@ daList 

out={EuclideanDistance[{{21, 18}, {20, 18}, {18, 17}, {20, 15}}, {0, 0}], 
    EuclideanDistance[{{21, 18}, {20, 18}, {21, 14}, {21, 14}}, {0, 0}]} 
+1

難道你不能使用'Map'的擴展形式來指定函數映射的級別嗎?看看'MapThread'。 – Verbeia

+0

是的,我只是沒有得到語法時,使用我認爲純函數與&。再次檢查地圖上的幫助,我無法推斷出下面提出的解決方案。 – 500

+0

@ Markus Roellig的解決方案顯示了您需要的解決方案。我正在召開電話會議,並沒有時間自己提供完整的解決方案。 – Verbeia

回答

6

您是否嘗試過Map中的Level規範?

Map[EuclideanDistance[#, {0, 0}] &, daList, {2}] 

{{3 Sqrt[85],2 Sqrt[181],Sqrt[613],25},{3 Sqrt[85],2 Sqrt[181],7 Sqrt[13],7 Sqrt[13]}} 
+0

這就是我想念的。無法弄清楚幫助中的語法,謝謝! – 500

6

爲了配合@Markus的答案:如果你的daList是非常大的和數值,下面會快很多(如30倍),雖然少了幾分一般:

[email protected][daList^2,{3}] 

下面是一個例子:

In[17]:= largeDaList = [email protected][30,{100000,4,2}]; 
In[18]:= Map[EuclideanDistance[#,{0,0}]&,largeDaList,{2}]//Short//Timing 
Out[18]= {0.953,{{31.7648,34.6699,20.3961,31.305},<<99998>>,{<<18>>,<<2>>,0.}}} 

In[19]:= [email protected][largeDaList^2,{3}]//Short//Timing 
Out[19]= {0.031,{{31.7648,34.6699,20.3961,31.305},<<99998>>,{<<18>>,<<2>>,0.}}} 

原因是像PowerSqrt這樣的函數是Listable,並且您將迭代推入內核。像Map這樣的函數在很多情況下也可以自動編譯映射函數,但顯然不是這種情況。

編輯

每個操作的要求,這裏是一個泛化到非平凡的參考點的情況下:

refPoint = {3, 5}; 
[email protected][#^2, {3}] &@Transpose[Transpose[daList, {3, 2, 1}] - refPoint, {3, 2, 1}] 

它仍然是快,但不是儘量精簡之前。爲了便於比較,這裏是一個基於Map代碼 - 平,只在這裏需要一個微不足道的修改:

Map[EuclideanDistance[#, refPoint] &, daList, {2}] 

的性能差異仍然是相同的數量級,雖然量化的解決方案減慢了一下,由於需要非平凡的換位。

+0

謝謝Leonid,我想我可以使用原點的變化來應用當我計算從mu點到另一個點(不是原點{0,0})的距離時這將會很有用,它確實有用,它還有 – 500

+0

@ 500請參閱我的編輯。 –

+0

謝謝你Leonid。 – 500