2015-07-04 35 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是按行而不是按元素进行子集。 –