2012-12-12 45 views
0

我對Mathematica非常陌生,對於創建函數時產生的錯誤我感到非常沮喪。下面,我有一個函數,我正在寫一個矩陣,其中行對應於示例,列與要素。目標是從每個元素中減去它所屬列的平均值。Set :: write:創建函數時出錯

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]; 
) 

運行此功能對於一個矩陣,我得到以下錯誤:

「設置::寫:標籤時報4 {} 5.84333,3.054,3.75867,1.19867是保護>> 套裝::寫:「4 \ 150中的標籤時間受到保護」

其中{5.84333,3.054,3.75867,1.19867}是數據矩陣中的第一個示例,150是矩陣中的示例數(I' m使用着名的iris dataset,對於任何感興趣的人)。這些錯誤對應於此代碼:

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

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

谷歌搜索和玩這個錯誤並沒有太大的幫助,因爲答覆通常涉及乘法,這顯然沒有在這裏完成。

+1

也許你想在每個命令的末尾使用';'。 –

回答

2

給定數據表(tab),函數Mean[tab]將返回每列平均值的列表。接下來,要減去這從表中的每一行(元素智能),試試這個:

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

我有一種感覺,有可能是任何一種內在的統計功能,在一個聲明或者,要做到這我對更簡單的解決方案一無所知。

既然你是一個初學者,我建議你立即閱讀的文檔:

  • Map,這是函數式編程語言,如數學假裝是根本的運營商之一;和
  • 純函數其使用涉及神祕符號#&

如果你在Mathematica程序中編寫循環,你肯定會錯誤地使用系統。

+0

謝謝你的回答和指針,非常有用。 – Mike