2014-06-20 125 views
1

我正在開發一個涉及將MATLAB代碼移植到R中的項目,並且遇到了一大塊代碼問題。R中擴展矩陣

這段代碼在MATLAB中的作用是將一個掩碼(只有1s和0s)的大小調整爲與將要掩蓋的更大的一組數據相同的大小。掩碼應用於的數據大小會發生變化,所以我不能只爲縮放設置靜態值。

MATLAB代碼有一個功能resizem,它調整掩碼大小,保留唯一的1s和0s特性。

我已經搜索(無濟於事)解決我的問題,但我不認爲我的問題困擾許多R用戶(這是R的非傳統使用)。所以我想知道是否有人知道調整矩陣大小的方式,就像resizem一樣。

例如:

如果我有陣列

[1,0,1,1,1, 
0,0,0,1,1, 
1,1,0,0,1] 

,我想從3x5的比例將其與僅包含1和0這樣的7×10矩陣7×10。

1  1  0  0  1  1  1  1  1  1 
1  1  0  0  1  1  1  1  1  1 
0  0  0  0  0  0  1  1  1  1 
0  0  0  0  0  0  1  1  1  1 
0  0  0  0  0  0  1  1  1  1 
1  1  1  1  0  0  0  0  1  1 
1  1  1  1  0  0  0  0  1  1 

我怎麼能用R函數來處理這個問題。

+0

如果你(1)鏈接到MATLAB中'resizem'的文檔,並且(2)提供了你期望輸出的詳細描述,它將會有所幫助。 – joran

+0

把它放在問題中,而不是在評論中。 – joran

+0

是啊,不知道我在那裏想什麼... –

回答

2

這裏是一個可以人爲實現這樣的功能

resizem <- function(M, rows,cols) { 
    rs <- round(seq(0, rows-1)/(rows-1) * (nrow(M)-1) +1) 
    cs <- round(seq(0, cols-1)/(cols-1) * (ncol(M)-1) +1) 
    M[rs, ][, cs] 
} 

在這裏,我們只需要您指定在新的矩陣想行列數數。我們只使用默認的最近鄰居插值(resizem有其他選項)。這似乎與測試數據進行工作

M <- matrix(c(1,0,1,1,1, 
    0,0,0,1,1, 
    1,1,0,0,1), byrow=T, nrow=3) 
resizem(M, 7,10) 

,並返回

 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] 1 1 0 0 1 1 1 1 1  1 
[2,] 1 1 0 0 1 1 1 1 1  1 
[3,] 0 0 0 0 0 0 1 1 1  1 
[4,] 0 0 0 0 0 0 1 1 1  1 
[5,] 0 0 0 0 0 0 1 1 1  1 
[6,] 1 1 1 1 0 0 0 0 1  1 
[7,] 1 1 1 1 0 0 0 0 1  1 
+0

我會檢查這個,當我回到我的電腦,但看着它,我會說你是上帝派。謝謝! –

1

它不會立即明顯,我這是如何工作的時候重新調整矩陣不是大小的整數倍原來的面具,但如果是,那麼你可以使用一個Kronecker product

kronecker(z,matrix(1,nrow=2,ncol=2)) 

這使得6×10矩陣。要製作(3nx5n)矩陣,您可以在上例中使用nrow=n,ncol=n

OK,我從鏈接的文檔,請參見:

resizem使用插值重新採樣到一個新的樣本密度/細胞 大小。如果刻度在0和1之間,則Z的大小小於Z1的大小 。如果比例大於1,則Z的大小更大。例如,對於 示例,如果比例爲0.5,則行數和列數 將減半。默認情況下,resizem使用最近鄰居 插值。

所以這個技巧只適用於特殊情況。但它應該是非常有效的,也可以用於稀疏矩陣...

+0

我應該提到上面這個,但我試過這種方法無濟於事。我認爲是因爲它讀取的數據大小不同(很少是整數倍)。不過,這可能會在稍後的項目中派上用場。謝謝。 –