矩阵流:向右而不是向下?

时间:2011-01-24 19:40:13

标签: r

我不确定你称之为什么,但矩阵的默认'流量'是向下的(如下所示)

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

3 个答案:

答案 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