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 的右上角。我可以通过与变换矩阵 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,其余为零。人移动,新位置由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');
我希望通过使用这些选项,您可以将这段代码应用到更实际的案例中。
我有两个矩阵:矩阵 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 的右上角。我可以通过与变换矩阵 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,其余为零。人移动,新位置由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');
我希望通过使用这些选项,您可以将这段代码应用到更实际的案例中。