2015-07-04 58 views
2

這個問題更多的是關於應用函數中的MARGIN參數。假設我想將下面的矩陣乘以下面的向量,以便將第一個矩陣元素乘以第一個向量元素,第二個乘以第二個矩陣元素,依此類推。我使用下面的代碼:R中的應用函數中的保證金參數

matrix <- matrix(1:10) 
vector <- c(10:19) 
t(apply(matrix,2,'*',vector)) 

它返回一個非常乾淨的結果:

 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 10 22 36 52 70 90 112 136 162 190 

,但如果我改變保證金= 2,我得到這樣的結果:

matrix <- matrix(1:10) 
vector <- c(10:19) 
t(apply(matrix,1,'*',vector)) 

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 10 11 12 13 14 15 16 17 18 19 
[2,] 20 22 24 26 28 30 32 34 36 38 
[3,] 30 33 36 39 42 45 48 51 54 57 
[4,] 40 44 48 52 56 60 64 68 72 76 
[5,] 50 55 60 65 70 75 80 85 90 95 
[6,] 60 66 72 78 84 90 96 102 108 114 
[7,] 70 77 84 91 98 105 112 119 126 133 
[8,] 80 88 96 104 112 120 128 136 144 152 
[9,] 90 99 108 117 126 135 144 153 162 171 
[10,] 100 110 120 130 140 150 160 170 180 190 

我想,如果MARGIN = 1,則第一矩陣行將乘以每個向量元素,然後是第二矩陣行等,而MARGIN = 2只是將第一矩陣行乘以第一個向量元素?

有人能告訴我究竟有什麼不同嗎?

+0

首先:爲什麼'應用'?由於矢量化,只需't(矩陣*矢量)'即可實現。 – SabDeM

+0

沒有真正的原因,我只是不確定我怎麼能問這個問題。我想我可以問「MARGIN = 1和2有什麼區別,但我總是喜歡例子。」 – Adam

+0

我已經發布了一個解決方案,我希望它很清楚。 – SabDeM

回答

2

應用函數的邊距可以用維度來解釋:1 =行,2 =列。

當您設置MARGIN = 1你說成R來乘以你的矩陣的每一行與名爲vector載體。由於矢量化,即使你原來的結果是一行只有一個元素,你會得到10個元素。

的,其原因在於,使用諾曼·馬特夫的詞語的出色的書「R編程的藝術」:

當施加到兩個矢量,要求他們是 相同長度的操作,R自動回收或重複,較短的一個, 直到它長到足以匹配較長的

有天以前關於量化和==函數的行爲相當類似的討論,你可以找到它here

回到你的問題,讓我們考慮不是整個應用函數,而只是一次迭代,比方說矩陣的第一個元素乘以向量。我們有:

matrix[1] 
[1] 1 
vector 
[1] 10 11 12 13 14 15 16 17 18 19 
matrix[1] * vector 
[1] 10 11 12 13 14 15 16 17 18 19 

如在本書中,我列舉說,R採用了更短的矢量(在這種情況下matrix[1])和乘以vector但由於vector較長,R取短,回收它的「n 「時間越早越長,在這種情況下是10倍。

當然,我們只在一個案例中。 apply函數爲每一行執行此步驟,這是十個。結果,我們獲得了10×10的矩陣。

+0

Ahhhhh,我明白了!謝謝! – Adam

+0

You是受歡迎的,如果您發現它對您的目的有用且詳盡,請不要忘記接受答案。 – SabDeM

+0

我將'matrix [1]'替換爲'matrix [1,]',因爲apply是按行而不是按元素進行子集。 –