【问题标题】:Varying Symbols of sign programmatically以编程方式改变符号符号
【发布时间】:2021-12-04 14:37:26
【问题描述】:

我有一个数字向量:

v1 <- c(1,2,3)

我想以编程方式分析符号变化的影响 变体可能是:

v1[1] + v1[2] + v1[3] 
[1] 6
v1[1] + v1[2] - v1[3] 
[1] 0
v1[1] - v1[2] - v1[3] 
[1] -4
v1[1] - v1[2] + v1[3] 
[1] 2

如何以编程方式交换符号(“+”、“-”)?我认为这是一个愚蠢的问题,但我想不出我的出路,尽管我的分析线指向评估变化的迹象。

【问题讨论】:

    标签: r permutation symbols


    【解决方案1】:

    这里有一个快速的方法来获得矩阵乘法的所有可能性:

    signs = rep(list(c(1, -1)), length(v1))
    signs = do.call(expand.grid, args = signs)
    
    signs$sum = as.matrix(signs) %*% v1
    signs
    #   Var1 Var2 Var3 sum
    # 1    1    1    1   6
    # 2   -1    1    1   4
    # 3    1   -1    1   2
    # 4   -1   -1    1   0
    # 5    1    1   -1   0
    # 6   -1    1   -1  -2
    # 7    1   -1   -1  -4
    # 8   -1   -1   -1  -6
    

    如果您不想要所有组合,您可以将 signs 数据框过滤到感兴趣的组合,或者以仅创建您关心的组合的方式构建它。

    【讨论】:

    • 您的回答宁愿指出我错过了可能有影响的可能性(排列),即。 v1[1] 也可以是 -v1[1],随着网格的扩展,世界会发生变化。进一步的问题,给定一个菊花链 expand.grid(v1) sign(+/-) expand.grid(v)2 sign(+-) expand.grid(v3) ...我想有更好的方法解决,但显然仍在探索。受到了惩罚,但愚蠢地没有被吓倒。谢谢。
    • @Chris 您的评论使这看起来像是一个 XY 问题 - 我不知道您将其应用于什么,但我会考虑写一个关于您的分析和发布的方法/目标的问题它经过交叉验证 (stats.stackexchange.com)。
    • 这是导出行列式的“Gbemi 方法”。 Paper, nxn, n>3,并在 r 中可靠地运行 4x4,尽管他使用的是 Matlab。我正在做 5x5 的工作。上面爆炸到 9 x 1024,但我认为有一个可靠的循环使得他使用拉普拉斯方法作为校验和可能是不必要的。我认为这更像是一个数学/基础扩展问题,但答案的重要性和细微差别可能会让我难以理解。
    【解决方案2】:

    您可以使用gtools::permutations 来获取所有可能的符号排列,使用apply 来评估每个组合的值。

    v1 <- c(1,2,3)
    sign <- c('+', '-')
    
    all_comb <- gtools::permutations(length(sign), length(v1) - 1, v = symbols, repeats.allowed = TRUE)
    
    do.call(rbind, apply(all_comb, 1, function(x) {
      exp <- do.call(sprintf, c(fmt = gsub(',', ' %s', toString(v1)), as.list(x)))
      data.frame(exp, value = eval(parse(text = exp)))
    }))
    
    #        exp value
    #1 1 - 2 - 3    -4
    #2 1 - 2 + 3     2
    #3 1 + 2 - 3     0
    #4 1 + 2 + 3     6
    

    【讨论】:

    • 向量长度 n 和符号长度 n-1,这是否仍然适用于 n &gt; 3 ,或者它是否可以扩展(我知道这会以某种方式涉及正则表达式......) ?
    • 这是可扩展的。您无需更改答案中的任何内容。试试v1 &lt;- 1:5
    • 好的,我会带着? 回来讨论更多中间的 `sign('+', '-') 方面,这些方面会出现在 v1[1:3] (sign) v2 之间。 ..但这让我开始了。
    • 我注意到你的 5(以前是 10),因为我只是在评估 5 及以上,我必须凭经验接近(因此排列)才能随着 n 的增加达到正确的符号顺序。
    猜你喜欢
    • 2018-01-31
    • 2013-05-22
    • 2021-07-13
    • 2010-12-12
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多