【问题标题】:Why multiplying two matrices need opposite order compared to its visual apply order in transform matrix与变换矩阵中的视觉应用顺序相比,为什么将两个矩阵相乘需要相反的顺序
【发布时间】:2023-03-31 21:40:01
【问题描述】:

我是reading a book,谈论 iOS UIView 转换属性,并在使用 CGAffineTransformConcat 函数时注意到图片中的这一事实,来自文档 CGAffineTransformConcat 只是将其两个参数相乘,但如果你想获得图 1 -9,你的变换矩阵参数需要相反的顺序

这让我很困惑,经过一番搜索发现wiki 这么说

换句话说,组合变换 A 后跟 B 的矩阵只是各个矩阵的乘积。注意,乘法是按照与英文句子相反的顺序进行的:“A后跟B”的矩阵是BA,而不是AB。

我不太明白这一点,因为根据我目前的知识,矩阵不是可交换的,但可以关联,所以如果原始坐标从右边乘以一切都可以这样解释

let X = original coordinate
first multiply A --> A*X
then B           --> B*(A*X)
equal            === (B*A)*X
here the final combined matrix BA's order is opposite!

但是从苹果文档中,原始坐标是从左乘的

谁能解释一下,谢谢

【问题讨论】:

    标签: ios matrix uiview transform calayer


    【解决方案1】:

    这样想:
    您将把必须转换的向量 x(假设坐标用柱状向量表示)放在哪里?你把它放在最后一个,即 BAx 。所以首先是 B(Ax),然后是 (B(Ax))。所以基本上你是先申请A,然后申请B。

    在 ios 中,它们不是将坐标表示为列向量,而是使用行向量。因此,乘法的顺序发生了变化。

    注意:-如果你在两边取转置,你可以观察到它给出了另一个表示。

    假设 x 是一个列向量。 教科书法 = BAx 让我们把它的转置 转置(B*A*x) = 转置(x) * 转置(B*A)
    = 转置(x) * 转置(B*A)
    = 转置(x) * (转置(A) * 转置(B))
    = 转置(x) * 转置(A) * 转置(B)
    将 transpose(A) 重写为 A' 并将 transpose(B) 重写为 B'
    = 转置(x) * A' * B'
    = ios 符号

    如果我们在一种表示中使用 M,那么我们必须在另一种表示中使用 transpose(M)。 请参阅此https://www.cs.utexas.edu/~fussell/courses/cs384g/lectures/lecture07-Affine.pdf 中的第 5 页

    尝试在两种表示中关联 tx 和 ty。
    列表示(来自 wiki)


    行表示(来自问题)

    【讨论】:

    • 但就像我在问题中所说的那样,苹果文件的接缝就像从左边乘以 X
    • 我已经更新了我的答案。通常我们在列表示中使用向量。在 ios 中,他们使用行表示。如果您在两侧进行转置。你会看到魔法。希望有帮助
    • 其实我已经想到了转置的事情,但不是那样的,因为在矩阵中你可以设置影响x平移的tx元素,如果从右乘这个tx元素应该位于右上方提供给函数参数时的角,但实际上我将此元素设置在左下角并分配给变换属性以进行翻译
    • 您不能在两者中使用相同的矩阵。如果您在其中一个中使用 A,那么您必须在另一个中使用 transpose(A)。让我试着为你找到一个链接。 en.wikipedia.org/wiki/… 用于柱状向量表示
    • cs.utexas.edu/~fussell/courses/cs384g/lectures/… ... 第 5 页和第 18 页。您可以将第 18 页的内容与您在苹果文档中为 ios 显示的图像进行比较。它只是使用列或行来改变表示。由于您已经共享了平移矩阵,请尝试比较这些表示中的矩阵。你会看到两者都是一样的,只是一个是另一个的转置
    猜你喜欢
    • 2022-11-11
    • 1970-01-01
    • 2015-01-24
    • 2016-12-11
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多