我有两个矩阵:矩阵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。
我知道这听起来很模糊,这就是为什么我只是问上线的原因。
答案 0 :(得分:1)
由于您的问题是非线性的,因此可以有多个解决方案,@ 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');
我希望通过使用这些选项,您可以将此代码应用于更实际的案例。