为什么要以这种方式实现矩阵和向量的不等式?[关闭]

Why the implementation of inequality of matrix and vectors in such way? [closed]

提问人:feesh 提问时间:1/25/2022 更新时间:1/25/2022 访问量:89

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

去年关闭。

运算符的实现似乎不对,但我不确定。
这是 https://github.com/NVIDIA/cuda-samples/blob/master/Common/nvMatrix.h
https://github.com/NVIDIA/cuda-samples/blob/master/Common/nvVector.h 的链接

        friend bool operator != (const quaternion<T> &lhs, const quaternion<T> &rhs)
        {
            bool r = true;

            for (int i = 0; i < 4; i++)
            {
                r &= lhs._array[i] == rhs._array[i];
            }

            return r;
        }

例如,作为向量和矩阵模板。

        friend bool operator != (const vec4<T> &lhs, const vec4<T> &rhs)
        {
            bool r = true;

            for (int i = 0; i < lhs.size(); i++)
            {
                r &= lhs._array[i] != rhs._array[i];
            }

            return r;
        }

        friend bool operator != (const matrix4 &lhs, const matrix4 &rhs)
        {
            bool r = true;

            for (int i = 0; i < 16; i++)
            {
                r &= lhs._array[i] != rhs._array[i];
            }

            return r;
        }
C++ 矩阵 CUDA 运算符-关键字 相等

评论

1赞 Ranoiaetep 1/25/2022
版本似乎不正确,但是您对 and 版本的哪一部分有困难?quaternionvec4matrix4
0赞 Peter 1/25/2022
如果不深入研究该库如何表示四元数,就很难说。但是,从数学上讲,对四元数的一些运算对于没有详细专业知识的人来说是违反直觉的。事实上,库可以通过多种方式表示它们,这使得解释特定操作的工作原理变得更加困难 当然,它可能只是一个错误 - 当开发人员在理解他们正在实现的核心概念时遇到挑战时,错误更有可能发生。
1赞 talonmies 1/25/2022
因此,有人在 CUDA 示例中操作员的一个实例中打错了字(请注意,这些是不打算用于生产用途的玩具示例)。如果它困扰您,请在 NVIDIA 开发者门户上提出错误报告。否则我真的不明白这里的问题是什么
0赞 feesh 1/25/2022
@talonmies我是这方面的初学者,我不确定是否有什么我没有学到的东西。由于代码来自著名的 Nvidia。
1赞 Retired Ninja 1/25/2022
对于向量和矩阵,一旦任何条件为假,无论其余条件如何,它都将保持为假。, , .1 &= 1 == 11 &= 0 == 00 &= 1 == 0

答:

1赞 Ranoiaetep 1/25/2022 #1

当一个矩阵的所有元素都相等时,矩阵等于另一个矩阵,如果只有一个不同的元素,则 2 个矩阵是不同的。但是在这里,所有元素都必须不同,因此返回值可以是真的,我无法理解这一点。

但这不是代码在这里的工作方式。您只需要其中一个值不同即可返回。true


让我们看一下这部分:

bool r = true;

for (int i = 0; i < 4; i++)
{
    r &= lhs._array[i] != rhs._array[i];
}

让我们假设:

lhs._array = [0,1,2,3]
rhs._array = [1,1,1,3]

什么时候是 ,会变成:i0r &= lhs._array[i] != rhs._array[i]

r &= 0 != 1
// or
r &= true

由于 ,是 .true & true => truertrue


现在,如果是,那么将变为:i1r &= lhs._array[i] != rhs._array[I]

r &= 1 != 1
// or
r &= false

既然,就是现在。true & false => falserfalse


现在,如果是,那么将变为:i2r &= lhs._array[i] != rhs._array[I]

r &= 2 != 1
// or 
r &= true

由于 ,仍然是 .false & true => falserfalse


现在,如果是,那么将变为:i3r &= lhs._array[i] != rhs._array[I]

r &= 3 != 3
// or 
r &= false

由于 ,仍然是 .false & false => falserfalse


总之,将成为第一次是 ,并且它将保留在循环的其余部分。rfalselhs._array[i] != rhs._array[i]falsefalse

评论

0赞 feesh 1/25/2022
谢谢,这个答案很容易理解。