R 将矩阵转换为列主订单格式

R 将矩阵转换为列主订单格式,r,matrix,column-major-order,R,Matrix,Column Major Order,我正在使用Rsymphony,决定使用CPLEX。我正在研究R中的cplexAPI,我更愿意使用我现有的结构来构建约束矩阵。文档中说,API采用列主顺序格式的约束矩阵,只包含非零元素。所以我需要一种方法(我希望是优雅地)将矩阵转换成这种形式 例如: 3.2创建和解决混合整数规划(MIP)问题 下面将创建并解决一个示例MIP: 受制于: 目前,这是一个矩阵 > mat = matrix(c(-1, 1, 1, 10, + 1, -3, 1, 0, +

我正在使用
Rsymphony
,决定使用
CPLEX
。我正在研究R中的
cplexAPI
,我更愿意使用我现有的结构来构建约束矩阵。文档中说,API采用列主顺序格式的约束矩阵,只包含非零元素。所以我需要一种方法(我希望是优雅地)将矩阵转换成这种形式

例如:

3.2创建和解决混合整数规划(MIP)问题 下面将创建并解决一个示例MIP:

受制于:

目前,这是一个矩阵

> mat = matrix(c(-1, 1, 1, 10, 
+                 1, -3, 1, 0, 
+                 0, 1, 0, -3.5),byrow = TRUE, nrow=3,ncol=4)
> mat
     [,1] [,2] [,3] [,4]
[1,]   -1    1    1 10.0
[2,]    1   -3    1  0.0
[3,]    0    1    0 -3.5
从文档中,我需要以下元素

约束矩阵以列主顺序格式传递。这里要小心:所有索引都从0开始!开始行的索引

我可以通过以下方式轻松创建
cnt

c(mat)
[1] -1.0  1.0  0.0  1.0 -3.0  1.0  1.0  1.0  0.0 10.0  0.0 -3.5
val2 <- mat[mat !=0]
val <- c(-1.0, 1.0, 1.0, -3.0, 1.0, 1.0, 1.0, 10.0, -3.5)
val2 & val
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
cnt <- apply(mat,2,function(x) Matrix::nnzero(x, na.counted = NA))
cnt
[1] 2 3 2 2
beg
是沿着
val
中非零元素的位置计数的索引。因此在
mat[1,1]
中,是
mat
中的第一个非零元素,也是
val
中的第一个(0)元素。在
mat[,2]
中,第一个非零元素是
val
中的第三个元素(2)。在
mat[,3]
中,第一个非零元素是
val
中的第六(5)个元素,在
mat[,4]
中,第一个非零元素是
val
中的第八(7)个元素


清澈如泥?我也是。

我不太清楚您希望得到什么,但这里有一种生成行号和列号的方法,可以使用基于零的索引对该矩阵中的非零项进行索引(这对于R矩阵索引是不正常的,尽管正如您所看到的,该规则不适用于使用矩阵包函数构造的稀疏矩阵。):


我不太清楚您希望得到什么,但这里有一种生成行号和列号的方法,可以使用基于零的索引对矩阵中的非零项进行索引(这对于R矩阵索引是不正常的,尽管正如您所看到的,该规则不适用于使用矩阵包函数构造的稀疏矩阵。):


谢谢!这当然适用于
ind
。我同意这不清楚,我正在尝试使用一个API,这花了我一段时间来思考。我短暂地看到了一个复选标记。是否还需要其他内容?是否需要不同的行定义?是的,我添加了一些解释。我需要
beg
。我不知道我是否可以为部分答案或什么给出复选标记。谢谢!这肯定适用于
ind
。我同意这不清楚,我正在尝试使用一个API,这花了我一段时间才弄明白。我短暂地看到了一个复选标记。还需要其他什么吗?是否需要不同的行定义“是的,还有一条,我加了一些解释。我需要
beg
。我不知道我是否可以在部分答案上打勾。
ind <- c(0, 1, 0, 1, 2, 0, 1, 0, 2)
val <- c(-1.0, 1.0, 1.0, -3.0, 1.0, 1.0, 1.0, 10.0, -3.5)
c(mat)
[1] -1.0  1.0  0.0  1.0 -3.0  1.0  1.0  1.0  0.0 10.0  0.0 -3.5
val2 <- mat[mat !=0]
val <- c(-1.0, 1.0, 1.0, -3.0, 1.0, 1.0, 1.0, 10.0, -3.5)
val2 & val
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
cnt <- apply(mat,2,function(x) Matrix::nnzero(x, na.counted = NA))
cnt
[1] 2 3 2 2
ind2 <- row(mat)[which(mat != 0)]-1
ind <- c(0, 1, 0, 1, 2, 0, 1, 0, 2)
ind2 == ind
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
mat
     [,1] [,2] [,3] [,4]
[1,]   -1    1    1 10.0
[2,]    1   -3    1  0.0
[3,]    0    1    0 -3.5
beg <- c(0, 2, 5, 7)
val <- c(-1.0, 1.0, 1.0, -3.0, 1.0, 1.0, 1.0, 10.0, -3.5)
row(mat)[which(mat != 0)]-1
#[1] 0 1 0 1 2 0 1 0 2
col(mat)[which(mat != 0)]-1
#[1] 0 0 1 1 1 2 2 3 3