Разница между первым элементом матрицы 1x1 и всеми элементами матрицы 1x1

после нахождения некоторой логики в как пустые структуры рассматриваются, Я хотел проверить, как это обобщить на матрицы.

здесь я заметил следующее:

Если у вас есть матрица 1x1, и назначьте первому элементу. Это не то же самое, что присвоение всем элементам.

Это скорее удивило меня, поскольку первый элемент такой же, как и все элементы в этом случае. Вот мои наблюдения:--4-->

x = 1;
y = 1;
z = 1;

x(:) = []; % Evaluates to [] as I expected
y(1) = []; % Evaluates to Empty matrix: 1-by-0, rather than []
z(1,1) = []; %Throws an error: 'Subscripted assignment dimension mismatch.' even though size(z)  gives [1 1];
z(1,:) = []; % Evaluates to Empty matrix: 0-by-1, just like z(:,:) = []

после просмотра вот мой вопрос:

почему назначение одной и той же вещи разными способами приводит к четырем различным результатам?

1 ответов


это просто похоже на последовательность.

давайте рассмотрим большую матрицу и посмотрим, согласуется ли поведение с 1 - by -1 матрица (предупреждение спойлера, на мой взгляд):

X = rand(3);

Пример 1:

X(1,1) = []

не имеет смысла, чтобы это сработало. Мы не можем сохранить форму и отбросить один элемент, поэтому мы получаем ошибку несоответствия размеров, что согласуется с вашим наблюдением. Также размер несоответствие является соответствующей ошибкой, поскольку мы пытаемся заставить 0 - by -0 матрицы в 1 - by -1 слот. (Кстати, на боковой ноте вы говорите size(z) дает [1 1] но size(z, 3) дает 1 и size(z,7) etc так что на самом деле это [1 1 1 ... матрица)

Пример 2:

X(1) = []

в результате X такое, что size(X) is 1 - by -8, MATLAB, похоже, рад линеаризовать вашу матрицу, если вы укажете линейный индекс. Это имеет смысл для меня, и снова соответствует 1 - by -1 случае, так как это приводит к 1 - by -numel(X)-1 матрица (т. е. 1 - by -0 на X = 1)

Случай 3:

X(1,:) = []

это довольно прямо вперед, снимите первый ряд, так что теперь у нас есть n-1 - by -m матрица. Так 3 - by -3 становится 2 - by -3 так что я доволен 1 - by -1 становится 0 - by -1 in этот случай. Обратите внимание, что X(:,1) = [] также последователен в подобном ключе.

пример 4:

X(:) = []

это просто имеет смысл, переписать всю матрицу. Никакой вопрос. Нет никакой двусмысленности.

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