Matlab获取变换矩阵

Matlab obtain Transformation matrix

我有两个矩阵:矩阵 1:A,这是我一开始的矩阵和矩阵 2:B置换了 A 中的一些值。两者都只填1和0(主要是0)

例如

    0 0 0          0 0 1
A = 0 1 0  and B = 0 0 0
    0 0 0          0 0 0

我将值 1 从矩阵 A 的中间移动到矩阵 B 的右上角。我可以通过与变换矩阵 T1T2.

相乘来手动完成此操作

对于上面的例子:

     0 1 0           0 0 0
T1 = 0 0 0  and T2 = 0 0 1  such that  P1 * A * P2 = B
     0 0 0           0 0 0

我如何计算这两个转换矩阵 P1P2 并且 Matlab 非常快(对于矩阵 > 5000x5000 ) 只知道矩阵 AB?


目标是在矩阵 A 上的每一步移动一些。因为我有其他一些像层一样的矩阵,我想以相同的方式移动它们,所以我想得到 T1T2 所以我可以用同样的方式改变它们。

所以问题是我有一个岛屿,它是从 GoogleMaps 获得的,我将其转换为 0(水)和 1(陆地),然后我随机将人们放在该地图上 M。然后我随机设置一些人的位置M有一个。这些人设在矩阵A上,一个为1,其余为零。人移动,新位置由MatrixB给出。虽然不是所有人都被僵尸感染了,但我有一个向量,它定义了一个子矩阵,僵尸所在的位置。这个小矩阵很重要,所以我移动了我的僵尸和僵尸具有的一些其他属性(它们由其他矩阵定义,我称它们为 lazer 矩阵)。所以我只想跟踪 Zombiematrix 的变化(为此我需要转换矩阵),以便所有具有僵尸子矩阵属性的层矩阵都以相同的方式移动。 ZombieMatrix 越来越大,感染的人也越来越多。为了节省时间,我一步步寻找一个包含所有Zombies的子矩阵,然后对这个子矩阵进行Transformationmatrix。

我知道这听起来很模糊,这就是为什么我只是问这条线上方的路。

由于您的问题是非线性的,因此它可以有多个解决方案,来自@knedlsepp 的评论。出于这个原因,我认为求助于遗传算法可能是一个不错的选择,自然不看性能...

让我们将您的问题重新表述为优化问题

这里我们采用Frobenius范数

那么代码看起来像

%// Build the test matrices
A = [0 0 0 ; 0 1 0 ; 0 0 0];
B = [0 0 1 ; 0 0 0 ; 0 0 0];
n = size(A, 1);

%// Define the optimization problem.
nvars = 2*n^2;
lb = zeros(nvars, 1);
ub = ones(nvars, 1);
intCon = 1:nvars;
options = gaoptimset();

%// Solve the problem.
[t,err,exitflag] = ga(@(t) fitnessfcn(t, A, B, n),  ...
                      nvars, [], [], [], [], lb, ub, [], intCon, options);

%// Retrieve the solution
T1 = reshape(t(1:n^2), n, n);
T2 = reshape(t(n^2+1:end), n, n);

并且fitnessfcn

function err = fitnessfcn(t, A, B, n)

T1 = reshape(t(1:n^2), n, n);
T2 = reshape(t(n^2+1:end), n, n);
E = T1*A*T2-B;
err = norm(E, 'fro');

我希望通过使用这些选项,您可以将这段代码应用到更实际的案例中。