【发布时间】:2021-11-03 19:22:01
【问题描述】:
我有两个矩阵 A(51 行 X 5100 列)和 B(51 行 X 5100 列),我想用 B 的每一行减去 A 的每一行以获得另一个矩阵 C(2601 行 X 5100 列)。我怎样才能得到矩阵 C?
【问题讨论】:
我有两个矩阵 A(51 行 X 5100 列)和 B(51 行 X 5100 列),我想用 B 的每一行减去 A 的每一行以获得另一个矩阵 C(2601 行 X 5100 列)。我怎样才能得到矩阵 C?
【问题讨论】:
你可以这样做
51 × 1 × 5100 和 1 × 51 × 5100 的 3D 数组;51 × 51 × 5100的数组;51*51 × 5100 矩阵。A = rand(51, 5100); % example matrix
B = rand(51, 5100); % example matrix, same number of columns
C = reshape(permute(A, [1 3 2]) - permute(B, [3 1 2]), [], size(A, 2));
【讨论】:
问题的关键在于为两个矩阵获取正确的行对。为此,您可以使用meshgrid() 函数生成一个矩阵,该矩阵沿其行从1:n 变化,并沿其列变化(其中n 是行数)。
例如:
mtx1 = reshape(1:9, 3, 3);
mtx2 = reshape(101:109, 3, 3);
n1 = size(mtx1, 1);
n2 = size(mtx2, 1);
[r1, r2] = meshgrid(1:n1, 1:n2);
这给出了:
r1 =
1 2 3
1 2 3
1 2 3
r2 =
1 1 1
2 2 2
3 3 3
接下来,将r1 和r2 都展平:
f1 = r1(:)
f2 = r2(:)
现在,我们有:
f1 =
1
1
1
2
2
2
3
3
3
f2 =
1
2
3
1
2
3
1
2
3
我们可以使用f1 和f2 作为行对的索引:
mtx1(f1, :) 将mtx1 的第一行重复三次,然后是第二行,然后是第三行
mtx1(f1, :)
1 4 7
1 4 7
1 4 7
2 5 8
2 5 8
2 5 8
3 6 9
3 6 9
3 6 9
mtx2(f2, :) 将整个矩阵 mtx2 重复三次
mtx2(f2, :)
101 104 107
102 105 108
103 106 109
101 104 107
102 105 108
103 106 109
101 104 107
102 105 108
103 106 109
减去这两个,你得到你的两两行差异:
mtx2(f2, :) - mtx1(f1, :)
100 100 100
101 101 101
102 102 102
99 99 99
100 100 100
101 101 101
98 98 98
99 99 99
100 100 100
这也适用于 mtx1 和 mtx2 具有不同的行数。
【讨论】: