Matlab сравнивает две матрицы с разной размерностью

Я вижу, люди принимают ==, ~=, >, < между матрицами с другим измерением в скобках после матрицы, чтобы получить ее записи, например:

b =

     1     4     7
     2     5     8
     3     6     9

>> b == [1 2 3]

ans =

  3×3 logical array

   1   0   0
   0   0   0
   0   0   0

>> b == [1 4 7]

ans =

  3×3 logical array

   1   1   1
   0   0   0
   0   0   0

>> b == [1 4 5]

ans =

  3×3 logical array

   1   1   0
   0   0   0
   0   0   0

>> b == [1 5 4]

ans =

  3×3 logical array

   1   0   0
   0   1   0
   0   0   0

>> a

a =

     1     2     3     4     5     6     7     8     9    10
     1     2     3     4     5     6     7     8     9    10
     1     2     3     4     5     6     7     8     9    10

>> a(:, b == [1 4 5])

ans =

     1     4
     1     4
     1     4

>> a(:, b == [1 5 4])

ans =

     1     5
     1     5
     1     5

>> b

b =

     1     4     7
     2     5     8
     3     6     9

>> b > [1 3 2]

ans =

  3×3 logical array

   0   1   1
   1   1   1
   1   1   1

Однако я понятия не имею, почему они будут работать. Любое объяснение об этом использовании? (Мой английский не подходит для лучшего описания вопроса, надеюсь, кто-нибудь может отредактировать этот вопрос, чтобы сделать его более понятным? Заранее спасибо!)

1 ответ

Решение

Начиная с R2016b, MATLAB использует неявное расширение. Это означает, что одноэлементные размеры входов (размеры размером 1) повторяются так же, как и другие входные данные.

Например:

b = [1  4  7 
     2  5  8 
     3  6  9]

%% Singleton dimension as rows
b == [x y z]
% is equivalent to
b == repmat([x y z], size(b,1), 1)
% is equivalent to
b == [x  y  z  
      x  y  z 
      x  y  z]

%% Singleton dimension as columns  
b == [x; y; z]
% is equivalent to
b == repmat([x; y; z], 1, size(b,2))
% is equivalent to
b == [x  x  x
      y  y  y
      z  z  z]

Все 3 ваших примера представляют собой случай "одиночное измерение как строки", повторяя вектор строки сравнения вниз и сравнивая с каждой строкой b, Вы можете легко увидеть, что выходы соответствуют ожиданиям.


Неявное расширение может использоваться во всех версиях MATLAB (включая pre-R2016b) с использованием bsxfun, Это будет выглядеть так:

% Since 2016b
b == [1 2 3];
% All versions (@eq is the '==' equals function)
bsxfun(@eq, b, [1 2 3])
Другие вопросы по тегам