same()对于相同的矩阵返回False和True

时间:2016-09-27 02:36:07

标签: r

代码即将结束。

我一直在尝试对程序进行故障排除,以生成GL2的循环子组。出于某种原因,当生成器具有从小数表示具有无限多个数字的分数计算的元素时,它会出现问题(但仅当元素被定义为参数时)。即使该生成器的某些幂的元素与单位矩阵的元素相同,我仍然无法获得相同的()以返回TRUE。

我已经设法弄清楚实际上如何分配生成器的值存在一些问题,但我无法弄清楚原因。重申一下,我知道这个问题是由于我的代码实际上将小数字符串转换为数字而引起的(我已经在shell环境中对此进行了验证)。我只是不明白为什么会发生这种情况,尽管很明显它与十进制表示中无穷无尽的数字有关。

调用像•require __DIR__.'/…/bootstrap/autoload.php'; to •require __DIR__.'/bootstrap/autoload.php'; modify - $app = require_once DIR.'/../bootstrap/app.php'; to - $app = require_once DIR.'/bootstrap/app.php'; 这样的程序给我一个例子,即生成器的顺序是无限的(当它应该等于2时)。 Rscript code.R 0 1/3 3 0为我提供了正确顺序的正确子组。当我使用组件{0,1 / 3,3,0}定义生成器而没有所有字符串操作时,我也得到了正确的顺序。在任何一种情况下,我仍然得到一个矩阵,如果i = j,则其元素为ij = 1,如果i = / = j,则对于发生器的偶数幂,ij = 0。那么我错过了什么呢?

Rscript code.R 0 1/2 2 0

1 个答案:

答案 0 :(得分:2)

好的,所以我最初的想法(数字精度)已经关闭了。 原因是args字符向量。因此,当您将temp[1]/temp[2](一个数字)保存回args时,它会被强制转换为一个字符。

这意味着无论您的显示宽度是多少,它都会被切断,例如对我来说args[2]将是"0.333333333333333"。当然,当它被转换回数字时,你得到的数字与1/3不同。 (我通过在print(args)之前添加as.numeric来查看发生的情况,从而发现了这一点。

因此,解决方案是创建一个不同的向量 - 一个 numeric - 用于保存参数的数值(以防止它们被强制转换为字符串)。

e.g。

# convert to numeric, suppressing warnings for fractions which won't convert
n.args <- suppressWarnings(as.numeric(args))

然后在循环中,将数值保存到n.args而不是args

for(i in 1:length(args)){
    if(length(grep("/",args[i])) != 0){
        temp <- as.integer(unlist(strsplit(args[i],"/")))
        n.args[i] <- temp[1]/temp[2] # <--- here
    }
}

在你的其余部分中使用n.args而不是`args。 那应该没问题。

(除了:

  1. while循环之后的行似乎在while循环中加倍了一些。我认为通过调整开始/结束条件,您可以避免这种情况。
  2. 您为同一A %^% i多次计算i。对于2x2矩阵,我想这不是很昂贵,但对于较大的矩阵可能会变得如此。考虑为每个循环存储A %^% i,然后只是引用存储的值,而不是重新计算。您已将其存储在matrixlist[[i]]中,因此只需使用{而不是A %^% i进行后续调用。
  3. 例如main

    i <- 1
    matrixlist <- list(A)
    if (det(A) == 0) {
        stop("Matrix is not invertible", call.=FALSE)
    } else {
        while (!identical(matrixlist[[i]], id)) {
            i = i + 1
            matrixlist[[i]] <- A %^% i
        }
        print(matrixlist)
        sprintf("Order of generator = %d", i)
    }