2

この質問は、同じ長さの 2 つのリストを比較する前のスレッドの続きです。

Mathematica で同じ長さの2つのリストを比較する効率的で簡単な方法はありますか?

A={a1,a2,a3,...an}との 2 つのリストが与えられた場合、 all の場合に限りB={b1,b2,b3,...bn}ます。これでリストがあり、存在する場合は最大のものを見つけたいと考えています。A>=Bai>=bikH={{a11,a12,a13,...a1n}, {a21,a22,a23,...a2n},...,{ak1,ak2,ak3,...akn}}

これが私のコードです:

Do[If[NonNegative[Min[H[[i]] - h]], h = H[[i]], ## &[]], {i, h = H[[1]]; 1, Length[H]}];h

これを行うためのより良いトリックはありますか?

編集:

これを次のような関数として定義したい:

maxList[H_]:=Do[If[NonNegative[Min[H[[i]] - h]], h = H[[i]], ## &[]], {i, h = H[[1]]; 1, Length[H]}];h

しかし、問題は上記のコードが 2 行にまたがっているということですが、これに対する修正はありますか? ここにいくつかのコードが機能していますが、それほど美しくはありません

maxList[H_] := Module[{h = H[[1]]}, Do[If[NonNegative[Min[H[[i]] - h]], h = H[[i]], ## &[]], {i, Length[H]}]; h]

また

maxList[H_]:=Last[Table[If[NonNegative[Min[H[[i]] - h]], h = H[[i]], ## &[]], {i, h = H[[1]]; 1, Length[H]}]]

4

3 に答える 3

5

これはうまくいくはずだと私には思えます:

maxList = # \[Intersection] {Max /@ Transpose@#} &;

maxList[ {{4, 5, 6}, {1, 4, 3}, {4, 3, 5}, {5, 6, 7}} ]
{{5, 6, 7}}

を使用するコストについては考えていませんでしたがIntersection、Artes はそれMemberQがはるかに優れた選択であることを示しています。(私がしたように彼の答えに投票してください)。私は自分自身を使わずに関数を書きますModule

maxList[a_] := If[MemberQ[a, #], #, {}] &[Max /@ Transpose@a]

それほど高速ではありませんが、ほぼ同等の方法は次のとおりです。

maxList = Cases[#, Max /@ Transpose@# , 1, 1] &;

結果は{{a, b, c}}or{}ではなく{a, b, c}orの形式になり{}ます。

于 2012-01-17T08:29:31.770 に答える
3

ウィザード氏のアプローチの修正は、数倍速く機能します。

maxListFast[list_List] := Module[{l}, 
                                 l = Max /@ Transpose@list; 
                                 If[MemberQ[list, l], l, {}]]

両方の方法をテストします

test  = RandomInteger[100, {500000, 10}];
test1 = Insert[test, Table[100, {10}], RandomInteger[{1, 500000}]]; 

そして私達は得る

In[5]:= maxList[test] // Timing
        maxListFast[test] // Timing

        Out[5]= {2.761, {}}
        Out[6]= {0.265, {}}

In[7]:= maxList[test1] // Timing
        maxListFast[test1] // Timing

Out[7]= {1.217, {{100, 100, 100, 100, 100, 100, 100, 100, 100, 100}}}
Out[8]= {0.14, {100, 100, 100, 100, 100, 100, 100, 100, 100, 100}}

編集

一般に、方法を選択するには、最初にどのような種類のデータを処理するかを知る必要があります。(リストの長さ、それらの数、数のタイプ)。整数の短いリストが多数ありますが、maxListFast(長さが10のリストが500000の場合)よりも10倍優れていますmaxList。ただし、実数のリストの場合は3〜4倍高速であり、リストが長くなるほど遅くなります。例:

         A = RandomReal[1000, {3000, 3000}];
         First@AbsoluteTiming[maxListFast@A;]/ First@AbsoluteTiming[maxList@A;]

Out[19]= 2.040516    

ただし、「最大要素」を挿入すると:

In[21]:= IA = Insert[A, Table[1000, {3000}], RandomInteger[{1, 3000}]];
In[22]:= First@AbsoluteTiming[maxListFast@IA;]/ First@AbsoluteTiming[maxList@IA;]

Out[22]= 0.9781931

タイミングがクローズアップ。

于 2012-01-17T15:05:52.657 に答える
2

一部のデータ:ところで、実際には個々のサブリストにラベルを付ける必要はありません。簡単に参考にしました。

a = {4, 5, 6}; b = {1, 4, 3}; c = {4, 3, 5}; d = {5, 6, 7};

lists = {a, b, c, d};

maxListは、サブリストが最大のリストであるかどうか、つまり、その各要素が他のすべてのサブリストのそれぞれの要素よりも大きいかどうかを判断します。最初に、サブリストは最大リストであると仮定します。その仮定に違反した場合 (Negativeではなく を使用していることに注意してくださいNonNegative)、False が返されます。ところで、リストはそれ自体と比較されます。から削除するよりも簡単listsです。そしてそれは結果に影響しません。

maxList[list_] :=
   Module[{result = True, n = 1},
   While[n < Length[lists] + 1, 
   If[Negative[Min[list - lists[[n]]]], result = False; Break[]];  n++]; result]

上記のサブリストの 1 つが maxList であるかどうかを確認してみましょう。

greatestList = {};
n = 1; While[n < Length[lists] + 1, 
If[maxList[lists[[n]]], greatestList = lists[[n]]; Break[]]; n++];
Print["The greatest list (if one exists): ", greatestList]

(* output *)
The greatest list (if one exists): {5,6,7}

サブリスト d は maxList です。

maxList がない場合、結果は空のリストになります。

于 2012-01-17T05:56:45.480 に答える