2014-10-13 5 views
1

Лучший способ получить размер неизвестного до настоящего времени символа.Размеры замещенного символа

Например:

foo = Dimensions[undefined][[1,1]]; 
foo /.undefined -> {{1,2},{3,4}} 

Тезисы строк кода не работают. Кто-нибудь знает, как правильно писать? Мне нужно импортировать значения подстановками. «foo» как функция и «a» в качестве параметра, к сожалению, не является альтернативой для меня.

ответ

1

У вас есть правильная идея в вашем автоответчике, и я голосовал за нее. Однако вы должны знать, что 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 Стек Обмен:

Mathematica.StackExchange

+0

Спасибо за эту деталь прозрения! – Matthias

1

Я нашел возможность:

нужно обернуть 'Размеры'

dim[x_?MatrixQ] := Dimensions[x]; 
... 
foo = dim[undefined][[1,1]]; 
foo /.undefined -> {{1,2},{3,4}} 

Это работает!

Смежные вопросы