Set :: write:创建函数时出错

时间:2012-12-12 18:49:13

标签: wolfram-mathematica

我对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}中的标记时间受保护。&gt;&gt; Set :: write:“4 \ 150中的标记时间受保护。”

其中{5.84333,3.054,3.75867,1.19867}是数据矩阵中的第一个例子,150是矩阵中的例子数量(我使用着名的iris dataset,对于任何感兴趣的人)。这些错误对应于此代码:

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

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

谷歌搜索和玩弄此错误并没有多大帮助,因为回复一般与乘法有关,这显然没有在这里完成。

1 个答案:

答案 0 :(得分:2)

给定一个数据表(tab),函数Mean[tab]将返回每列的均值列表。接下来,你想从表中的每一行中减去这个(按元素),试试这个:

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

我觉得在一个陈述中可能有一个内在的统计函数,或者我对一个更简单的解决方案视而不见。

由于您是初学者,我建议您立即阅读以下文档:

  • Map,它是函数式编程语言中的基本运算符之一,例如Mathematica假装的;和
  • 纯函数,其使用涉及神秘符号#&

如果您在Mathematica程序中编写循环,几乎肯定会误用系统。