xt::random::binomial returns 基于输出大小的不同结果

xt::random::binomial returns different results based on output size

我正在编写代码以在 XTensor 中生成 0 和 1 的 NxN 矩阵,其中条目为 1 的概率为 1/N。此外,我想丢弃对角线及以上的所有值。最后,我想找到所有 1 的索引。因此,我使用以下代码:

auto binomial = xt::tril(
                    xt::random::binomial(
                            xt::shape<uint32_t>({N, N}), 1, 1/N
                    ),
                    1
            );
std::vector<std::array<unsigned int, 2>> vals = xt::argwhere(binomial);

此处vals的预期大小应为N。当我尝试N=100、N=1000、N=10000时是这样,但当我尝试N=100000时不成立。这种方法有什么我不知道的限制吗?

看来你不得不担心这里的类型。在内部,您应该能够解析 N * N 上的索引。对你来说 N = 1e5 这意味着 1e10uint32_t is about 4e9 的最大尺寸,这样就意味着你溢出了。

似乎有效的是

size_t N = 100000;
auto binomial = xt::tril(
                xt::random::binomial(
                        xt::shape<size_t>({N, N}), 1, 1/(double)N
                ),
                1
        );
auto vals = xt::argwhere(binomial);

我想知道这是否应该被视为一个错误。查看 API 我希望 xt::shape<uint32_t>({N, N}) 应该是能够处理您想要的最大 N 的类型。相反,似乎 xt::shape<T> 为内部大小设置了 T,因此 T 应该是可以处理 N^d 的类型。我想知道您能够以这种方式影响内部类型是否应该被认为是公平的。请考虑打开一个错误报告(对这个问题有 link)来解决这个问题。