2014-02-05 284 views
1

我是Mathematica的新手,我還有一項任務需要弄清楚,但是我找不到答案。我有兩個數字列表( 「B」, 「U」):Mathematica解決方案?

b = {8.734059001373602`, 8.330508824111284`, 5.620669156438947`, 
    1.4722145583571766`, 1.797504620275392`, 7.045821078656974`, 
    2.1437334927375247`, 2.295629405840401`, 9.749038328921163`, 
    5.9928406294151095`, 5.710839663259195`, 7.6983109942364365`, 
    1.02781847368645`, 4.909108426318685`, 2.5860897177525572`, 
    9.56334726886076`, 5.661774934433563`, 3.4927397824800384`, 
    0.4570000499566351`, 6.240122061193738`, 8.371962670138991`, 
    4.593105388706549`, 7.653068139076581`, 2.2715973346475877`, 
    7.6234743784167875`, 0.9177107503732636`, 3.182296027902268`, 
    6.196168580445633`, 0.1486794884986935`, 1.2920960388213274`, 
    7.478757220079665`, 9.610332785387424`, 0.05088141346751485`, 
    3.940557901075696`, 5.21881311050797`, 7.489624788199514`, 
    8.773397599406234`, 3.397275198258715`, 1.4847171141876618`, 
    0.06574278834161795`, 0.620801320529969`, 2.075457888143216`, 
    5.244608900551409`, 4.54384757203616`, 7.114276285060143`, 
    2.8878711430358344`, 5.70657733453041`, 8.759173986432632`, 
    1.9392596667256967`, 7.419234634325729`, 8.258205508179927`, 
    1.185315253730261`, 3.907753644335596`, 7.168561412289151`, 
    9.919881985898002`, 3.169835543867407`, 8.352858871046699`, 
    7.959492335118693`, 7.772764587074317`, 7.091413185764939`, 
    1.433673058797801`}; 

u={5.1929, 3.95756, 5.55276, 3.97068, 5.67986, 4.57951, 4.12308, 
2.52284, 6.58678, 4.32735, 7.08465, 4.65308, 3.82025, 5.01325, 
1.17007, 6.43412, 4.67273, 3.7701, 4.10398, 2.90585, 3.75596, 
5.12365, 4.78612, 7.20375, 3.19926, 8.10662}; 

這是 「B」 和 「u」 的LinePlot;

plot

我首先需要5個號碼從 「B」 比較第1個數字中的 「u」 和總是留下最大(更換 「B」 < 「U」 與 「U」)。然後,我需要移動2個數字,比較第3,4,5,6和7個「b」與第2個「u」等(總是移動=> 2步)。但是重疊的數字需要被「記住」並且在下一步中進行比較,以便始終獲得最大值(例如,第三,第四和第五「b」必須>第一和第二「u」)。

可能最簡單的方法是覆蓋圖像中顯示的整個函數的最大值,但我對這個軟件是新手,我沒有這樣的經驗。如果有人想通過一個可以完成我上面描述的功能來做到這一點,那將是非常棒的。

+0

bshift =分區[B,5,2]看看這個結果,使某些每組bshift是來自b的正確的5個數字,然後描述你在bshift中的哪些元素和第一個子列表以及結果應該是什麼,然後描述什麼元素和bshift的第二個子列表以及結果應該是什麼。 – Bill

+0

我知道「分區」功能,但我不知道如何將「b」分配給正確的「u」。我的初始功能看起來像這樣,我知道這是不正確的,但我想升級它。 '[i],[i],[i],[i],[i] 26}]'使它記住結果並分配正確的數字。 – seniorita

+0

您能否提供您對該輸入的期望輸出,或者至少是前六個位置的輸出?我想我可以用幾種不同的方式來解釋這一點,我不想浪費時間在錯誤的方面。 –

回答

1

我相信這你想要做什麼:

With[{n = Length @ u}, 
    Array[b[[#]] ~Max~ Take[u, ⌊{#-2, #+1}/2⌋ ~Clip~ {1, n}] &, 2 n + 3] 
] 
{8.73406, 8.33051, 5.62067, 5.1929, 5.55276, 7.04582, 5.55276, 5.55276, 9.74904,-- 

,或者如果uv的長度適當地匹配:

With[{n = Length @ u}, 
    MapIndexed[# ~Max~ Take[u, ⌊(#2[[1]] + {-2, 1})/2⌋ ~Clip~ {1, n}] &, b] 
] 

這些都不可小視比Mark的解決方案更快。用下面的數據:

u = RandomReal[{1, 1000}, 1500]; 
b = RandomReal[{1, 1000}, 3004]; 

馬克的代碼需要2.8秒,而我的採取0.014和0.015秒。


請要求在專用數學 StackExchange網站你的未來的問題:

enter image description here

+0

非常感謝,完美的作品!我也需要同樣的事情,但我知道只要將「Max」改爲「Min」就行了吧? – seniorita

+0

@seniorita不客氣。是的,只將'Max'更改爲'Min'應該是正確的。 –

0

我認爲您的數據存在一個小問題,u沒有像Partition[b,5,2]那樣多的元素。離開這一方面,我能做的最好的是:

Max /@ Transpose[ 
    Table[Map[If[# > 0, Max[#, u[[i]]], 0] &, 
    RotateRight[PadRight[Partition[b, 5, 2][[i]], Length[b]], 
    2 (i - 1)]], {i, 1, Length[u]}]] 

它開始產生與您的評論相同的數字。

和以往一樣,從最內層的表達中挑選出來,並向外工作。

+0

我意外地產生了比我應該少的「u」,但現在它完美地工作!謝謝!我想知道我是否可以將它改爲MIN,所以我總是得到最小值。 「b」或「u」(類似於最大值)...我改變了它,但我想它不像看起來那麼容易...... – seniorita