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])