這並不完全回答你的問題,但我找到它時,試圖找出一個類似的問題,所以我會告訴你的東西。
假設你有一個函數,你想要應用到矩陣的每個元素只需要一個部分。
mydouble <- function(x) {
return(x+x)
}
,說你有一個矩陣X,
> x=c(1,-2,-3,4)
> X=matrix(x,2,2)
> X
[,1] [,2]
[1,] 1 -3
[2,] -2 4
那麼你這樣做:
res=mydouble(X)
然後,它會做的每個值的各個元素的雙層。
但是,如果您在下面的函數中執行邏輯,您將得到一個警告,表明它沒有參數化,並且不像您期望的那樣運行。
myabs <- function(x) {
if (x<0) {
return (-x)
} else {
return (x)
}
}
> myabs(X)
[,1] [,2]
[1,] 1 -3
[2,] -2 4
Warning message:
In if (x < 0) { :
the condition has length > 1 and only the first element will be used
但是,如果你使用apply()函數,你可以使用它。
例如:
> apply(X,c(1,2),myabs)
[,1] [,2]
[1,] 1 3
[2,] 2 4
所以這是很大的,對不對?那麼,如果你有一個具有兩個或更多參數的函數,它就會崩潰。例如說,你有這樣的:
mymath <- function(x,y) {
if(x<0) {
return(-x*y)
} else {
return(x*y)
}
}
在這種情況下,你使用apply()函數。但是,它將丟失矩陣,但結果正確計算。如果你這麼傾向,他們可以改革。
> mapply(mymath,X,X)
[1] 1 -4 -9 16
> mapply(mymath,X,2)
[1] 2 4 6 8
> matrix(mapply(mymath,X,2),c(2,2))
[,1] [,2]
[1,] 2 6
[2,] 4 8
您是否熟悉正確命名的'apply()'函數族? MARGIN參數接受行,列和行與列的值。更不用說,很多R函數都是矢量化的,可以避免這種類型的編程。 – Chase
@leden你可以舉一個'f()'的例子嗎?據我所知,任何矢量化函數都可以在矩陣上工作,因爲它只是一個具有dim屬性的矢量。您不需要將其分解成行和列索引。目前,你Q中存在一些含糊不清的情況;似乎你想要一個通用的解決方案,但禁止它應該基於指數,這是次優的。 –
我的意思是,爲什麼不能寫'f()',使得你真正需要的是'm [] < - f(m)'?我會添加一個例子... –