-
21-09-2019 - |
题
我正在寻找解决以下问题的算法:
我有两组向量,我想找到最接近从输入向量到输出向量的变换的矩阵。
向量是 3x1,所以矩阵是 3x3。
这是普遍的问题。我的特殊问题是我有一组 RGB 颜色,以及另一组包含所需颜色的颜色。我正在尝试找到一种 RGB 到 RGB 的转换,使我的颜色更接近所需的颜色。
输入和输出向量之间存在对应关系,因此计算应最小化的误差函数是容易的部分。但我怎样才能最小化这个功能呢?
解决方案
您没有指定语言,但以下是我在 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
这 给出了一个与语言无关的解决方案来解决问题。
其他提示
这是一个典型的线性代数问题,关键短语搜索上“多元线性回归”。
我已经在过去几年编写过很多次的一些变化。例如,代码以校准数字化纸簿或触笔触摸屏使用相同的数学。
下面的计算方法如下:
让的 P 强>是输入矢量和问强>相应的输出矢量。
要的变换是3×3矩阵;称它为的 A 强>
有关单个的输入和输出向量的 P 和问下,存在一个误差向量的ë强>
<强>电子强> = 问强> - 的 A 强> X <强> P 强>
的误差的大小的平方是标量值:
<强>电子强>ŤX的ë强> =(问强> - 的 A 强> X <强> P 强>) ŤX(问强> - 的 A 强> X <强> p 强>)
(其中T接线员是转置)。
你真的希望尽量减少什么是总和的电子在组值:
<强>电子强> =总和(的ë强>)
此最小满足矩阵方程的 d 强> = 0,其中
<强>ð强>(I,J)= <强>电子强>相对于为 A 强>(I,J)
的偏导数假设有N个输入和输出向量。
您输入的3矢量的集合是一个3×N个矩阵;调用此矩阵的 P 即可。 的第i列的 P 强>是第i个输入矢量。
那么,该组输出3-向量;调用此矩阵问强>
当你磨通所有的代数的,解决的办法是
<强> A 强> = 问强> X <强> P 强>ŤX(的 P 强> X <强> P 强>Ť )^ -1
(其中^ -1是逆算子 - 约没有标或下标对不起)
这里的算法:
从输入矢量集的创建3×N个矩阵的 P 强>
从该组输出向量的创建3×N个矩阵问强>
矩阵乘法的 - [R 强> = <强> P 强> X的转置(的 P 强>)
计算所述inverseof的 - [R 强>
矩阵乘法的 A 强> = 问强> X的转置(的 P 强>)X逆(的 - [R 强>)
使用矩阵乘法和你选择的线性代数库矩阵求逆例程。
<强>然而下,3×3的仿射变换矩阵能够缩放和旋转的输入向量,但<强>不强>做任何翻译!这可能不是一般的足够您的问题。它通常是在每一个3-矢量,使然后4矢量的端追加了“1”,并寻找最好3×4变换矩阵,该误差最小的好主意。这不能伤害;它只能导致更好的拟合数据。
一些线性代数应该足够:
写输入和输出之间的平均平方差(每个输入和输出值之间的每个差值的平方和)。我认为这作为定义“最好的近似”
这是您的9未知矩阵系数的二次函数。
要最小化,对于它们中的每导出它。
您会得到你必须解决,以获得溶液(唯一的或依赖于输入设定的空间品种)9个方程的线性系统
当差函数没有平方,可以执行相同的,但必须使用迭代方法来求解方程系统。