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
这意味着 1e10
。 uint32_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)来解决这个问题。
我正在编写代码以在 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
这意味着 1e10
。 uint32_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)来解决这个问题。