Matlab获得转换矩阵

时间:2015-01-03 19:36:03

标签: matlab matrix transformation

我有两个矩阵:矩阵1: A ,这是我在开头的矩阵和矩阵2: B ,其中有一些来自 A的值置换。两者都只填充了1和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 的右上角。我可以通过乘以转换矩阵 T1 T2 来手动执行此操作。

以上示例:

     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

如何通过仅知道矩阵 P1 和 P2 Matlab非常快(对于矩阵> 5000x5000) > A 和 B


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

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

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

1 个答案:

答案 0 :(得分:1)

由于您的问题是非线性的,因此可以有多个解决方案,@ knedlsepp的注释。出于这个原因,我认为采用遗传算法可能是一个不错的选择,自然不用看表演......

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

1, T2] = argmin norm(T1*A*T2-B), subject to: T1,T2 in [0 1]; T1,T2 in Integers

这里我们将采用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');

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