Подтвердить что ты не робот

Разница между численными и длинными функциями MATLAB

Я знаю, что length(x) возвращает max(size(x)), а numel(x) возвращает общее количество элементов x, но лучше для массива 1 на n? Это имеет значение или они взаимозаменяемы в этом случае?

EDIT: Только для пинок:

alt text

Похоже, что они одинаковы по производительности, пока вы не достигнете 100k элементов.

4b9b3361

Ответ 1

В этом случае они возвращают то же самое, и нет никакой разницы. С точки зрения производительности, это зависит от внутренней работы массивов в MATLAB. Например. если есть metainformations о том, сколько элементов в массиве (независимо от формы), то числовое значение выполняется как можно быстрее, а max (size (x)), похоже, требует больше работы для получения того же самого (получение размеров и затем найдя макс среди них). Я привык использовать numel в этом случае, но речь о производительности (гипотетическая) обособленно, я бы сказал, что они взаимозаменяемы.

Ответ 2

Для массива 1-by-N они по существу одинаковы. Для многомерного массива M они могут давать разные результаты:

  • numel(M) эквивалентно prod(size(M)).
  • length(M) эквивалентно max(size(M)). Если M пусто (т.е. Любое измерение равно 0), то length(M) равно 0.

Ответ 3

Как говорят другие, они одинаковы для одномерного массива.

IMHO с точки зрения удобочитаемости кода length следует использовать для одномерных массивов. Речь идет о "преднамеренное программирование" , вы видите код и понимаете, что программист имел в виду при задуманной работе. Поэтому, когда я вижу numel, я знаю, что он используется на матрице.

length vs. numel был предметом обсуждения в нашей команде в течение ряда лет. Бывший старший разработчик не заботился о работоспособности кода, а только о том, что работа выполняется и используется только numel в противном случае не хорошо читаемый/отформатированный код. Другой парень - математик и использовал length только для числовых массивов, являющихся для него "реальными" массивами. Для массивов ячеек и структурных массивов он использовал numel.