Какое правило лежит в основе того, как одноэлементные измерения сжимаются в подматрице?

Мне кажется, что MATLAB сжимает одноэлементные измерения в правой части последнего неодноэлементного измерения с тем ограничением, что матрица должна быть как минимум двумерной.

Вывод правила из примеров заставляет меня чувствовать себя некомфортно, но, похоже, это работает.

in 2D:

E = zeros(2,3);

E(1,:); % 1x3
E(:,1); % 2x1

in 3D:

E = zeros(2,3,4);

E(1,:,:); % 1x3x4
E(:,1,:); % 2x1x4
E(:,:,1); % 2x3

E(1,1,:); % 1x1x4
E(:,1,1); % 2x1
E(1,:,1); % 1x3

in 4D:

E = zeros(2,3,4,5);

E(:,:,:,1) % 2x3x4
E(:,:,1,1) % 2x3
E(:,1,1,1) % 2x1

E(1,:,:,:) % 1x3x4x5
E(1,1,:,:) % 1x1x4x5
E(1,1,1,:) % 1x1x1x5

E(:,:,1,:) % 2x3x1x5
E(:,1,:,:) % 2x1x4x5

E(1,:,:,1) % 1x3x4
E(1,:,1,:) % 1x3x1x5
E(:,1,:,1) % 2x1x4

E(1,1,:,1) % 1x1x4
E(1,:,1,1) % 1x3

Кто-нибудь может подтвердить, является ли это правилом?

Попутный вопрос: распространяется ли это правило и на такие функции, как diff()? Похоже на то.

Единственная разница, которую я вижу, заключается в том, что вы можете получить пустую матрицу, тогда одноэлементные измерения в левой части пустого измерения не удаляются, даже если это самое большое измерение:

E = zeros(2,3,4);

diff(E,1,1) % 1x3x4
diff(E,3,2) % 0x3x4

diff(E,2,2) % 2x1x4
diff(E,3,2) % 2x0x4

diff(E,3,3) % 2x3
diff(E,4,3) % 2x3x0

in 4D

E = zeros(2,3,1,5);
diff(E,3,4) % 2x3x1x2
diff(E,4,4) % 2x3
diff(E,5,4) % 2x3x1x0

Опять же, это просто специальное объяснение, и я не собираюсь проверять все возможные случаи. Каково правило?


person geoffrey    schedule 23.06.2019    source источник
comment
Но тогда попробуйте это: E = zeros(2,3); size(E,3)! Каждый массив на самом деле имеет в конце бесконечное количество одноэлементных измерений!   -  person Cris Luengo    schedule 23.06.2019
comment
Интересный комментарий. Это заставляет меня думать о завершающих нулях в десятичной части числа с плавающей запятой, с той разницей, что начальные одноэлементные размеры сохраняются, тогда как начальные нули в целочисленной части не имеют значения.   -  person geoffrey    schedule 23.06.2019


Ответы (1)


Любые конечные одноэлементные размеры, превышающие второе, автоматически удаляются. Таким образом, 1x2x1 автоматически станет 1x2, как и 1x2x1x1x1x1x1x1x1x1, но 2x1 останется 2x1. Это происходит, когда вы индексируете, как в вашем вопросе, а также когда такая функция, как diff(), выводит что-то, заканчивающееся размерами singleton.

Любые одноэлементные измерения, не являющиеся последними, остаются. Таким образом, 1x2x1x1x1x2 остается 1x2x1x1x1x2, а 1x2x1x1x1x2x1x1 также становится 1x2x1x1x1x2. Вы можете заставить squeeze() отключить все одноэлементные измерения; вы всегда будете иметь по крайней мере 2D-матрицу (даже если это всего лишь скаляр 1x1).


В качестве примечания, как Крис Лунего сказал:

Но тогда попробуйте следующее: E = zeros(2,3); size(E,3)! Каждый массив на самом деле имеет в конце бесконечное число одноэлементных измерений!

Таким образом, технически каждый массив имеет бесконечное количество измерений, причем все последние пусты, и MATLAB не показывает их по умолчанию, но они индексируются:

A = rand(3,3);
A(2,2,1)
ans =
    0.4854
A(2,2,1,1)
ans =
    0.4854

size(A)
ans =
     3     3
size(A,4)
ans =
     1
person Adriaan    schedule 23.06.2019