我不确定你称之为什么,但矩阵的默认'流量'是向下的(如下所示)
matrix(1,7,5)*(1:7)
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
6 6 6 6 6
7 7 7 7 7
如果您的意图是将向量乘以向右而不是向下,该怎么办?有没有更好的方法来编写下面的命令?是否存在列而不是行的切换(replicate(7,1:7)
相同,它假设向下流动(向下粘贴行向量而不是右侧的列向量);是否转置解决方案?)
t(t(matrix(1,7,5))*(1:5))
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
答案 0 :(得分:1)
矩阵只是具有dim属性的向量。矩阵的元素按列主要顺序存储在向量中,无法更改此值。 *
是一个逐个元素的运算符,可以根据需要回收它的参数。您可以通过以下方式查看回收规则:
> x <- matrix(1,7,5)
> x*1:5
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 2 4
[2,] 2 4 1 3 5
[3,] 3 5 2 4 1
[4,] 4 1 3 5 2
[5,] 5 2 4 1 3
[6,] 1 3 5 2 4
[7,] 2 4 1 3 5
您可以看到乘法是按列进行的,并且向量(1:5
)正在被回收到与矩阵相同的长度。您可以使用matrix
函数逐行调整矩阵大小,而不是转置。
> matrix(x*1:5,nrow(x),ncol(x),byrow=TRUE)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 1 2 3 4 5
[3,] 1 2 3 4 5
[4,] 1 2 3 4 5
[5,] 1 2 3 4 5
[6,] 1 2 3 4 5
[7,] 1 2 3 4 5
我不确定这是最有效的解决方案,但它是我现在能想到的最好的,而且比使用t
两次稍快一些。
答案 1 :(得分:1)
如果你真的想在定义矩阵后做很多事情,你可以自己做一个操作员:
'%mat%'<- function(x,y)t(t(x)*y)
matrix(1,7,5)%mat%1:5
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 1 2 3 4 5
[3,] 1 2 3 4 5
[4,] 1 2 3 4 5
[5,] 1 2 3 4 5
[6,] 1 2 3 4 5
[7,] 1 2 3 4 5
但是我认为如你在问题中所说的那样转换两次更容易:
t(t(matrix(1,7,5))*1:5)
或者当然选择在开始时转换矩阵一次,做你需要做的所有事情,然后将其转置回来。
据我所知,没有办法改变*的默认行为,你也可能不想这样做,
答案 2 :(得分:0)
你是说这个吗?
> matrix(rep(1:7,5), nrow=7, ncol=5)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 1 1
[2,] 2 2 2 2 2
[3,] 3 3 3 3 3
[4,] 4 4 4 4 4
[5,] 5 5 5 5 5
[6,] 6 6 6 6 6
[7,] 7 7 7 7 7
> matrix(rep(1:7,5), nrow=5, ncol=7, byrow=TRUE)
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 1 2 3 4 5 6 7
[2,] 1 2 3 4 5 6 7
[3,] 1 2 3 4 5 6 7
[4,] 1 2 3 4 5 6 7
[5,] 1 2 3 4 5 6 7