矩阵编程和函数

时间:2013-09-01 16:17:28

标签: r loops for-loop logic

我在下面有一个方形矩阵“a”作为例子见下文。矩阵a,是nxn方阵。

a = matrix( 
  c(1, 5 , 3, 7 , 3,
    5, 1, 2, 2, 4,
    3, 2 , 1, 2,4,
    7, 2, 2,1,3,
    2, 4,4 ,3 , 1   
   ),ncol = 5,nrow =5) 

我正在尝试在R中编写函数(x),如下所示,以便将其提供给优化例程。我正在尝试最小化函数(x),其中x是未知的。 x是矢量。

sumx <- function(x) {

sum(((a[i,j]*a[j,k])-(x[i]/x[j]))^2) for all i,j,k such that i not eq to j not eq to k
}

请你帮忙在R?

中编写这个逻辑和功能

非常感谢

1 个答案:

答案 0 :(得分:1)

您可以使用:

comb3 <- function(n){
    result <- expand.grid(i=1:n,j=1:n,k=1:n)
    result[with(result, i!=j & j!=k & i!=k & j>i),]
}

编辑:我已将条件i!=j & j!=k & i!=k & j>i表达为更具可读性,并包括您在评论中提到的条件。

sumx <- function(x) {
    sum(with(comb3(length(x)), ((a[cbind(i,j)]*a[cbind(j,k)])-(x[i]/x[j]))^2))
}

示例:

sumx(1:5)
#[1] 3584.542

请注意,我已将a[i,j]替换为a[cbind(i,j)],以允许对矩阵元素进行矢量化访问。

您现在可以对sumx进行优化,但最好将comb3(length(x))和不依赖x的部分保存为全局对象,以减少计算时间,例如这样:

y <- within(comb3(nrow(a)), b <- a[cbind(i,j)]*a[cbind(j,k)])

sumx <- function(x) {
    sum(with(y, (b-(x[i]/x[j]))^2))
}

对于最小化,您可以使用optim。请注意,我发现了两种不同的吸引子:

> optim(rep(1,5), sumx)
$par
[1] 1.9739966 1.5882750 1.5626338 0.1592725 0.1521839

$value
[1] 1436.526

$counts
function gradient 
     502       NA 

$convergence
[1] 1

$message
NULL

> optim(1:5, sumx)
$par
[1] 5.4254668 4.3857303 4.3029354 0.4374246 0.4199909

$value
[1] 1436.503

$counts
function gradient 
     218       NA 

$convergence
[1] 0

$message
NULL