2011-01-24 84 views
1

我不知道你把這個叫做什麼,但矩陣的默認「流」是向下的(如下圖所示)矩陣流:向右而不是向下?

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 
+1

要發佈代碼,只需每行前加四個空格。或者選擇您的代碼並按下「{}」按鈕。 *以前*是問題提問頁面右側的快速格式參考。還有[Markdown編輯幫助](http://stackoverflow.com/editing-help)頁面 – 2011-01-24 19:44:05

+3

您稱之爲「flow」的內容通常被稱爲[column-major](http://en.wikipedia .org/wiki/Column_major#Column-major_order)或[row-major](http://en.wikipedia.org/wiki/Column_major#Row-major_order)排序。 – 2011-01-24 19:44:53

回答

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) 

或者當然選擇在開始時轉置矩陣一次,做所有你需要做的事情,然後轉換回來。

據我知道有沒有辦法改變*的默認行爲,也不會你可能想太多,

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 
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兩次稍快。