簡體   English   中英

如何在matlab中用第二個矩陣的每一行減去矩陣的每一行?

[英]How do I subtract every row of a matrix with every row of a second matrix in matlab?

我有兩個矩陣 A(51 行 X 5100 列)和 B(51 行 X 5100 列),我想用 B 的每一行減去 A 的每一行以獲得另一個矩陣 C(2601 行 X 5100 列)。 我怎么能有矩陣C?

你可以這樣做

  1. 排列矩陣的維度以獲得大小(在您的示例中) 51 × 1 × 51001 × 51 × 5100 3D 數組;
  2. 隱式擴展減去,得到一個大小為51 × 51 × 5100的數組;
  3. 重塑將前兩個維度折疊為一個,得到最終的51^2 × 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

接下來,展平r1r2

f1 = r1(:)
f2 = r2(:)

現在,我們有:

f1 =

   1
   1
   1
   2
   2
   2
   3
   3
   3

f2 =

   1
   2
   3
   1
   2
   3
   1
   2
   3

我們可以使用f1f2作為我們的行對的索引:

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

mtx1mtx2具有不同的行數時,這也適用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM