У вас есть правильная идея в вашем автоответчике, и я голосовал за нее. Однако вы должны знать, что MatrixQ
не такой общий, как вы, возможно, захотите. Например, трехмерный тензор не сможет его:
tensor = RandomInteger[9, {3, 2, 4}];
MatrixQ[tensor]
False
Dimensions
может быть использован на выражение, которое еще не List
:
f[f[1, 2], f[3, 3]] // Dimensions
{2, 2}
Неправильное использование Part
. Обратите внимание на предупреждающее сообщение:
dim[undefined][[1, 1]]
В процессе оценки В работе [106]: = Часть :: partd: спецификации Часть тусклым [не определено] [[1,1]] больше, чем глубина объекта. >>
dim[undefined][[1, 1]]
Там нет части (1, 1) на выходе Dimensions
. Если вы используете [[1]]
, вы просто извлечете undefined
от dim[undefined]
. Вместо этого вы должны включить извлечение части в определении dim
, или если у вас есть Mathematica 10+ вы можете использовать Indexed
.
Я предлагаю:
dims[x : _[__], part__: All] := Dimensions[x][[part]]
Сейчас:
dims[undefined] /. undefined -> tensor
{3, 2, 4}
dims[undefined, 1] /. undefined -> tensor
3
dims[undefined, 2] /. undefined -> f[f[1, 2], f[3, 3]]
2
Посетите специализированный сайт Mathematica Стек Обмен:
Спасибо за эту деталь прозрения! – Matthias