gpt4 book ai didi

r - 方程组。如何拆分字符串以在 R 中获得两个矩阵 A 和 b

转载 作者:行者123 更新时间:2023-12-01 07:17:34 26 4
gpt4 key购买 nike

我有一个像这样的字符串(变量和常量的数量并不重要):

> my_string <- "-x+2y+z=-1; x-3y-2z=-1; 3x-y-z=4"

我知道如何获得 cbind(A, b)矩阵使用替换和数字函数...
#    [,1]   [,2]   [,3]    [,4]
# [1,] -1 2 1 -1
# [2,] 1 -3 -2 -1
# [3,] 3 -1 -1 4

...但不知道如何自动获得两个矩阵 Ab
A
# [,1] [,2] [,3]
# [1,]-1 2 1
# [2,] 1 -3 -2
# [3,] 3 -1 -1

b
# [,1]
# [1,]-1
# [2,]-1
# [3,] 4

这意味着我如何在 = 上拆分此字符串获得一个数字元素位于等号之前的矩阵和另一个元素位于等号之后的矩阵?

编辑。
到目前为止,我做了这个:
my_string<-"-x+2y+z=-1; x-3y-2z=-1; 3x-y-z=4"    
my_string<-gsub('([[:punct:]]|\\s)([a-z])', '\\11\\2', my_string)
my_string<-stringr::str_replace_all(my_string,"[a-z]"," ")
my_string<-stringr::str_replace_all(my_string,"; ",";")
my_string<-stringr::str_replace_all(my_string,"[-]","+-")
my_string<-stringr::str_replace_all(my_string,"[+]"," ")
my_string<-stringr::str_replace_all(my_string,"[=] ","=")
my_string<-stringr::str_replace_all(my_string," ",",")
my_string<-stringr::str_replace_all(my_string," ",",")
my_string<-stringr::str_replace_all(my_string," ",",")
my_string<-gsub("^,","",my_string)
my_string <- strsplit(my_string, "=|;")

我获得了:
# "-1,2,1"  "-1"      "1,-3,-2" "-1"      "3,-1,-1" "4"  

如何连接这个字符串?
> A <- "-1,2,1,1,-3,-2,3,-1,-1"
> b <- "-1,-1,4"

最佳答案

这里有一些替代方案。都可以处理像 my_string 这样的字符串如问题所示,但 (3)、(4) 和 (5) 也可以处理其中一些变量缺失且变量无序的方程。仅 (4) 对变量名称进行硬编码,但在 (5) 中对其进行了概括。

1) 在任何没有数字乘数的变量前插入 1 给出 s1 .然后提取变量名,假设它们都在字母上,并计算给出数字 n 的唯一变量名。 .然后提取数字,将它们转换为数字并使用 n 将它们塑造成矩阵。 .假设所有三个变量都存在于每个方程中,并且它们的顺序相同,因为在问题示例中就是这种情况。

library(gsubfn)

my_string<-"-x+2y+z=-1; x-3y-2z=-1; 3x-y-z=4"
s1 <- gsub('(^|\\W)([a-z])', '\\11\\2', my_string) # from your prior question

n <- length(strapplyc(s1, "[a-z]", simplify = unique))
matrix(strapply(s1, "(-?\\d+)", as.numeric, simplify = c), n, byrow = TRUE)

给予:
     [,1] [,2] [,3] [,4]
[1,] -1 2 1 -1
[2,] 1 -3 -2 -1
[3,] 3 -1 -1 4

2) 一个变体是拆分 s1从上面分号给出 s2 .然后使用 strapply找出给出的数字 mat .最后将数字从字符转换为数字。
library(gsubfn)

s2 <- strsplit(s1, ";")

mat <- do.call("rbind", sapply(s2, strapply, "(-?\\d+)"))
matrix(as.numeric(mat), nrow(mat))

给予:
     [,1] [,2] [,3] [,4]
[1,] -1 2 1 -1
[2,] 1 -3 -2 -1
[3,] 3 -1 -1 4

3) 此替代方法可以处理缺失的变量,例如在下面的示例中 y在第一个方程中缺失。 varnames是变量名。 extr函数采用变量名称并提取其系数,如果变量未出现,则为 0。
library(gsubfn)

my_string2 <- "-x+z=-1; x-3y-2z=-1; 3x-y-z=4"
s1 <- gsub('(^|\\W)([a-z])', '\\11\\2', my_string2)
s2 <- strsplit(s1, ";")

varnames <- sort(strapplyc(s1, "[a-z]", simplify = unique))
extr <- function(x)
strapply(s2[[1]], paste0("-?\\d", x), ~ as.numeric(gsub("\\D", "", x)), empty = 0)
A <- sapply(varnames, extr)
b <- as.numeric(sub(".*=", "", s2[[1]]))

给予:
> A
x y z
[1,] 1 0 1
[2,] 1 3 2
[3,] 3 1 1
> b
[1] -1 -1 4

4) 这个代替 x*c(1, 0, 0) , y*c(0,1,0)z*c(0,0,1)并评估它们以产生 A .它特别简单。它还可以处理并非所有变量都存在的方程。
假设变量是 x , yz虽然可以概括。
my_string2 <- "-x+z=-1; x-3y-2z=-1; 3x-y-z=4"
s1 <- gsub('(^|\\W)([a-z])', '\\11\\2', my_string2)
s2 <- strsplit(s1, ";")
s <- sub("=.*", "", s2[[1]])
s <- gsub("x", "*c(1, 0, 0)", s)
s <- gsub("y", "*c(0, 1, 0)", s)
s <- gsub("z", "*c(0, 0, 1)", s)
A <- eval(parse(text = paste("rbind(", paste(s, collapse = ","), ")")))
b <- as.numeric(sub(".*=", "", s2[[1]]))

给予:
> A
[,1] [,2] [,3]
[1,] -1 0 1
[2,] 1 -3 -2
[3,] 3 -1 -1
> b
[1] -1 -1 4

5) 这是 (4) 的通用版本,其中 x、y 和 z 不是硬编码的。它可以处理无序和缺失的变量。我们首先在 varnames中获取变量名, 拆分输入字符串给出 spl , 对于第 i 个变量名称,将其替换为 0 的向量,第 i 个位置为 1,给出 ss1 , 插入 *在任何以数字为前缀的向量之前,给出 ss2 , 删除 =以及之后的所有内容,并用 cbind(...) 包围它并将其计算为 R 表达式,给出 A . b=之后的一切转换为数字。
library(gsubfn)
my_string2 <- "-z+x=-1; x-3y-2z=-1; 3x-y-z=4"
ss0 <- my_string2
varnames <- sort(strapplyc(ss0, "[a-z]", simplify = unique))
spl <- strsplit(ss0, ";")[[1]]
ss1 <- gsubfn("[a-z]", x ~ (match(x, varnames) == seq_along(varnames))+0, spl)
ss2 <- gsub("(\\d)c", "\\1*c", ss1)
ss3 <- sub("=.*", "", ss2)
A <- eval(parse(text = paste("rbind(", paste(ss3, collapse = ","), ")")))
b <- as.numeric(sub(".*=", "", ss2))

给予:
> A
[,1] [,2] [,3]
[1,] 1 0 -1
[2,] 1 -3 -2
[3,] 3 -1 -1
> b
[1] -1 -1 4

关于r - 方程组。如何拆分字符串以在 R 中获得两个矩阵 A 和 b,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48734663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com