3

我正在寻找解决以下问题的算法:

我有两组向量,我想找到最接近从输入向量到输出向量的转换的矩阵。

向量是 3x1,所以矩阵是 3x3。

这是普遍的问题。我的特殊问题是我有一组 RGB 颜色,另一组包含所需的颜色。我正在尝试找到一个 RGB 到 RGB 的转换,这将使我的颜色更接近所需的颜色。

输入和输出向量之间存在对应关系,因此计算应该最小化的误差函数是容易的部分。但是我怎样才能最小化这个功能呢?

4

3 回答 3

6

这是一个经典的线性代数问题,要搜索的关键词是“多元线性回归”。

多年来,我不得不多次编写这种变体。例如,校准数位板或触控笔触摸屏的代码使用相同的数学运算。


这是数学:

p为输入向量,q为相应的输出向量。

您想要的转换是一个 3x3 矩阵;称它为A

对于单个输入和输出向量pq,有一个误差向量e

e = q - A x p

误差幅度的平方是一个标量值:

e T x e = ( q - A x p )T x ( q - A x p )

(其中 T 运算符是转置的)。

您真正想要最小化的是集合中e值的总和:

E = 总和 ( e )

这个最小值满足矩阵方程D = 0 其中

D (i,j) = EA (i,j)的偏导数

假设您有 N 个输入和输出向量。

您的输入 3 向量集是一个 3xN 矩阵;称这个矩阵PP的第 i 列是第 i 个输入向量。

输出 3 向量集也是如此;称这个矩阵Q

当您研究所有代数时,解决方案是

A = Q x P T x ( P x P T) ^-1

(其中 ^-1 是逆运算符——抱歉没有上标或下标)


这是算法:

从输入向量集创建 3xN 矩阵P。

从一组输出向量中创建 3xN 矩阵Q。

矩阵乘法 R = P x 转置 ( P )

计算R的逆

矩阵乘法A = Q x transpose( P ) x inverse ( R )

使用您选择的线性代数库的矩阵乘法和矩阵求逆例程。


但是,3x3 仿射变换矩阵能够缩放和旋转输入向量,但不能进行任何平移!对于您的问题,这可能不够通用。通常最好在每个 3 向量的末尾附加一个“1”以生成一个 4 向量,并寻找最小化误差的最佳 3x4 变换矩阵。这不会有伤害;它只能导致更好地拟合数据。

于 2009-10-15T17:38:32.963 回答
3

您没有指定语言,但这是我在 Matlab 中解决问题的方法。

  • v1 是一个 3xn 矩阵,包含垂直向量中的输入颜色
  • v2 也是一个包含输出颜色的 3xn 矩阵

你想解决系统

M*v1 = v2
M = v2*inv(v1)

但是,v1 不是直接可逆的,因为它不是方阵。Matlab 将使用 mrdivide 操作 (M = v2/v1) 自动解决此问题,其中 M 是最佳拟合解决方案。

eg: 
>> v1 = rand(3,10);
>> M = rand(3,3);
>> v2 = M * v1;
>> v2/v1 - M

ans =

   1.0e-15 *

    0.4510    0.4441   -0.5551
    0.2220    0.1388   -0.3331
    0.4441    0.2220   -0.4441

>> (v2 + randn(size(v2))*0.1)/v1 - M
ans =

    0.0598   -0.1961    0.0931
   -0.1684    0.0509    0.1465
   -0.0931   -0.0009    0.0213

为如何解决问题提供了一个与语言无关的解决方案。

于 2009-10-15T18:13:49.503 回答
3

一些线性代数就足够了:

写出输入和输出之间的平均平方差(每个输入和输出值之间每个差的平方和)。我认为这是“最佳近似值”的定义

这是 9 个未知矩阵系数的二次函数。

为了最小化它,请对它们中的每一个进行推导。

您将获得一个线性系统,其中包含 9 个方程,您必须求解才能获得解(唯一的或空间变化取决于输入集)

当差分函数不是二次的时,您可以这样做,但您必须使用迭代方法来求解方程组。

于 2009-10-13T11:17:45.980 回答