2

ポイントのパーによって定義された線の配列があります:

{{{340.754, 681.}, {361.889, 0.}}, {{760.286, 681.}, {775.156,0.}},
 {{398.028, 681.}, {420.73, 0.}}, {{0, 681.}, {239.46, 0.}},
 {{175.78, 681.}, {190.651, 0.}}}

最初のx点がゼロに等しい線を削除したいと思います。次のように試してみました。

 For[i = Length[lines], i > 0, i--, 
 If [lines[[i]][[1]][[1]] = 0, Delete[lines, i], 0]]

...しかし、それは機能していません。ヘルプ!

4

2 に答える 2

2

させて

mylist = {{{340.754, 681.}, {361.889, 0.}}, {{760.286, 681.}, {775.156,0.}},
 {{398.028, 681.}, {420.73, 0.}}, {{0, 681.}, {239.46, 0.}},
 {{175.78, 681.}, {190.651, 0.}}};

それから

mylist /. {{0, _}, {_, _}} -> Sequence[]

戻り値

{{{340.754, 681.}, {361.889, 0.}}, {{760.286, 681.}, {775.156, 
   0.}}, {{398.028, 681.}, {420.73, 0.}}, {{175.78, 681.}, {190.651, 
   0.}}}

そして、既存の定義を上書きしたい場合は、次のように書くことができます

 mylist = mylist /. {{0, _}, {_, _}} -> Sequence[]

Mathematica で特に単純な操作のためにループを書いていることに気付いた場合,言語を効果的に使用していないことはほぼ確実です.できる限り C (または最もよく知っている命令型プログラミング言語) をできるだけ忘れるようにしてください。

于 2012-11-09T19:25:51.937 に答える
0

Delete元の議論には触れません。Mathematica は関数型なので、ほとんどのオブジェクトは不変です。Delete変更されたリストを返すので、そうする必要があります

lines=Delete[lines,i]

=また、比較ではなく割り当てであることも忘れていました。したがって、使用==して比較すると、最終的なコードは

For[
 i = Length[lines], i > 0, i--,
 If[
  lines[[i]][[1]][[1]] == 0, lines = Delete[lines, i]
  ]
 ]
于 2012-11-09T19:17:29.537 に答える