犰狳错误的字段索引

Posted

技术标签:

【中文标题】犰狳错误的字段索引【英文标题】:Armadillo wrong field indexing 【发布时间】:2020-09-12 10:41:51 【问题描述】:

我需要构建一个 (R,G,B) 像素的 3d 立方体,以使 R、G 和 B 的值等于它们在立方体中的索引。

例如,在 Cube[0,0,0] 我应该找到黑色的像素 (0,0,0),而在 Cube[255,255,255] 的像素值应该是 (255,255,255) 或白色。 在实践中,立方体应该以 8 位存储所有可能的颜色。

为了实现这一点,我看到 Armadillo 库具有 field 类型。 所以我认为将每个像素存储在 Col<size_t> 中并从中构建和填充 3D 字段是合理的,如下所示:

#include <armadillo>
typedef arma::Col<size_t> Pixel;
int nc = 256;

arma::field<Pixel> my_cube(nc, nc, nc);

for (size_t i = 0; i < nc; i++)

    for (size_t j = 0; j < nc; j++)
    
        for (size_t k = 0; k < nc; k++)
        
            Pixel px =  i, j, k ;
            my_cube[i, j, k] = px;
            my_cube[i, j, k].print();  // here I get the correct value for (i,j,k)
        

    


my_cube[0, 0, 0].print();  // here I get (255,255,0) instead of (0,0,0)
// If I try my_cube(0,0,0).print() or my_cube.at(0,0,0).print()
// I get the same wrong result for the (0,0,0) pixel and 
// [matrix(0x1)] for different values of the indices.

但是,当我尝试在外循环之后访问一个元素时,我得到了错误的结果(参见上面的代码)。

有人可以解释这种行为吗?在 for 循环之后检索正确值时我缺少什么?

我本可以使用 OpenCV 轻松完成任务,但我正在编写的代码是我无法使用它的项目的一部分。

我正在使用 Armadillo 9.900 和 Visual Studio 2017。

【问题讨论】:

【参考方案1】:

operator[] 仅适用于单个参数。所以my_cube[i, j, k]是错误的。

您提到my_cube(0,0,0).print()my_cube.at(0,0,0).print() 也出现了同样的问题,但他们正在做正确的事情。但是,您还需要在分配期间使用它们中的任何一个。将my_cube[i, j, k] = px; 更改为my_cube(i, j, k) = px;my_cube.at(i, j, k) = px; 即可。

【讨论】:

以上是关于犰狳错误的字段索引的主要内容,如果未能解决你的问题,请参考以下文章

被索引的未设置字段:E11000 重复键错误集合

Facebook FQL 查询错误 604,但字段可索引

通过 Pandas 将 Excel 字段导入 Python 时遇到问题 - 索引越界错误

mongodb 3.4.2 InvalidIndexSpecificationOption 错误:字段“唯一”对于 _id 索引规范无效

C ++犰狳生成给定vec或矩阵的索引uvec而不循环它

如何在 Postgres 中的 JSON 字段上创建索引?