0

私は Mathematica を始めたばかりで、関数を作成する際に発生するエラーにかなりイライラしています。以下に、行が例に対応し、列が機能に対応するマトリックスを「センタリング」するために書いている関数があります。目的は、各要素から、それが属する列の平均を減算することです。

centerdata[datamat_] := (

  numdatapoints = 
   Dimensions[datamat][[1]](*Get number of datapoints*)

     numberfeatures = 
    Dimensions[datamat[[1]]][[1]](*Get number of datapoints*)

      columnmean = ((Total[datamat])/numdatapoints)

      For[i = 1, i < numdatapoints + 1, i++, (* For each row*)

       For[j = 1, j < numfeatures + 1, j++, (* For each element*)

              datum = datamat[[i]][[j]];
         newval = (datum - (colmean[[j]]));
         ReplacePart[datamat, {i, j} -> newval];
         ];
       ];

  Return[datamat];
  )

マトリックスに対してこの関数を実行すると、次のエラーが発生します。

"Set::write: 4 {5.84333,3.054,3.75867,1.19867} のタグ時間は保護されています。>> Set::write: "4\ 150 のタグ時間は保護されています。"

{5.84333,3.054,3.75867,1.19867} はデータ マトリックスの最初の例で、150 はマトリックスの例の数です (興味のある人のために、有名なアイリス データセットを使用しています)。これらのエラーは、次のコードに対応しています。

numdatapoints = Dimensions[datamat][[1]](*Get number of datapoints*)

numberfeatures = Dimensions[datamat[[1]]][[1]](*Get number of datapoints*)

応答は一般的に乗算に関連しているため、このエラーをグーグルで調べたりいじったりしてもあまり役に立ちませんでした。これは明らかにここでは行われていません。

4

1 に答える 1

2

データのテーブル(tab)が与えられると、関数Mean[tab]は各列の平均のリストを返します。次に、テーブルの各行からこれを(要素ごとに)減算する場合は、次のことを試してください。

Map[Plus[-Mean[tab],#]&,tab]

私は、これを1つのステートメントで実行するための固有の統計関数があるか、はるかに単純な解決策がわからないと感じています。

あなたは初心者なので、すぐに次のドキュメントを読むことをお勧めします。

  • Map、これはMathematicaのような関数型プログラミング言語の基本的な演算子の1つです。と
  • 不可解な記号#とを使用する純粋関数&

Mathematicaプログラムでループを書いているなら、あなたはほぼ間違いなくシステムを誤用している。

于 2012-12-12T19:47:18.360 に答える