我对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*)
谷歌搜索和玩弄此错误并没有多大帮助,因为回复一般与乘法有关,这显然没有在这里完成。
答案 0 :(得分:2)
给定一个数据表(tab
),函数Mean[tab]
将返回每列的均值列表。接下来,你想从表中的每一行中减去这个(按元素),试试这个:
Map[Plus[-Mean[tab],#]&,tab]
我觉得在一个陈述中可能有一个内在的统计函数,或者我对一个更简单的解决方案视而不见。
由于您是初学者,我建议您立即阅读以下文档:
Map
,它是函数式编程语言中的基本运算符之一,例如Mathematica假装的;和#
和&
。如果您在Mathematica程序中编写循环,几乎肯定会误用系统。