2017-09-01 55 views
2

我正在嘗試使用一個代碼對特徵值進行線性代數運算,其中我將一個向量傳遞給一個矩陣,然後再次將該向量傳回給相同的矩陣;我應該得到這個向量的穩態值。R函數作用域:希望在下一次迭代中看到返回值

這是我重複的例子版本:

M <- 2 
v <- c(2,4,6) 
c <- c() 
funscope <- function(){ 
    c <- (M * v)/max(v) 
    # want to return c and send it back in as 'v' 
    #? 
} 
replicate(2, funscope()) 

想(十進制形式)這兩個向量:

[4/6, 8/6, 12/6], [8/12, 16/12, 24,12] 
+0

在本例中這兩個向量都'C(0.667,1.333,2.000)'。那是你要的嗎? – MrFlick

+0

@MrFlick我認爲這是分配的一半 –

+0

我的意思並不是一般的值是相同的,只是返回值將在下一次迭代中使用。 – cumin

回答

0

根據您的自定義功能的替代版本,一個for循環用於填充列表。您可以使用C列表來存儲結果並將它們用於下一次迭代。

# your function 
funscope <- function(M, V){ 
    (M * V)/max(V) 
} 

# some starting params 
M <- 2 
V <- c(2,4,6) 
C <- list() 

# a foor loop to populate the list 
for (i in 1:2) { 
    if (i == 1) { 
    C[[i]] <- funscope(M, V) 
    } else { 
    C[[i]] <- funscope(M, C[[(i-1)]]) 
    } 
} 

結果保存在C

# print to console 
C 

[[1]] 
[1] 0.6666667 1.3333333 2.0000000 

[[2]] 
[1] 0.6666667 1.3333333 2.0000000 

如果你想獲得他們作爲基質,可以簡單rbind(逐行)或cbind(逐列)他們。

do.call(cbind, C) # rbind or cbind 
+0

這樣做的竅門是,除了當我運行它時,矢量垂直顯示,而不是水平顯示: – cumin

+0

使用as.vector()投射funscope的矩陣乘法結果,可以顯示水平顯示向量。再次,謝謝。 – cumin

+0

我很高興你發現這些行很有用。你可以在'do.call'調用中使用''cbind''來將'C'的元素轉換爲一個矩陣('cbind'以列的方式添加元素;如果你想讓它們添加行'by線)。乾杯! :-) –

1

做遞歸iteratin這樣往往是最簡單的一個循環,但Reduce函數也可以在這裏幫助。這裏有一個簡單的包裝,使之更容易與在這種情況下

iterfun <- function(f, start, N=1) { 
    Reduce(function(prev, curr) { 
    f(prev) 
    }, rep(1, N), init=start, acc=T)[-1] 
} 

工作這將需要的功能和自身重複執行它。

如果我們定義函數的正常功能,並開始了與

M <- 2 
v <- c(2,4,6) 
funscope <- function(v){ 
    (M * v)/max(v) 
} 

我們可以

iterfun(funscope, v, N=2) 
# [[1]] 
# [1] 0.6666667 1.3333333 2.0000000 
# 
# [[2]] 
# [1] 0.6666667 1.3333333 2.0000000 

運行它作爲一個傳統的循環中,我們可能會做

N <- 2 
out <- vector("list", N) 
x <- v 
for(i in 1:N) { 
    x <- funscope(x) 
    out[[i]] <- x 
} 
0

函數replicate只需重複表達多次。在與funscope不同的呼叫之間沒有信息交換。

如果要爲全局變量(即該函數的以外的變量)賦值,請使用v <<- c

然而,有一招,你的線性代數:

v %*% M = c_1 
c_1 %*% M = c_2 
c_2 = v %*% M %*% M = v %*% M^2 
1

通常,人們希望基於收斂測試而不是使用固定次數的迭代停止。當兩次連續迭代的最大差值小於eps時,這將迭代高達N次停止。在末尾cc包含的值匯聚到了,maxabseps包含錯誤並且i包含了運行的迭代次數。

M <- 2 
v <- c(2,4,6) 
N <- 100 # max no of iterations 
eps <- 1e-5 # abs error 

c <- v 
for(i in 1:N) { 
    cc <- (M * c)/max(c) 
    maxabsdiff <- max(abs(cc - c)) 
    cat(i, "maxabsdiff:", maxabsdiff, "vector:", cc, "\n") 
    if (maxabsdiff < eps) break 
    c <- cc 
} 

給這個輸出:

1 maxabsdiff: 4 vector: 0.6666667 1.333333 2 
2 maxabsdiff: 0 vector: 0.6666667 1.333333 2 
相關問題