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

34

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

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

Изображение 547

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

Теги:
arrays
microbenchmark

3 ответа

17
Лучший ответ

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

  • 4
    Вы правы в части исполнения. Я просто выполнил 100 итераций цифра против длины на х = 1: 100000000, и цифра была в среднем в 3,0919 раз быстрее. Не должно иметь большого значения для небольших массивов.
  • 0
    ... и теперь мне интересно узнать производительность чисел / длины по сравнению с размером массива.
Показать ещё 2 комментария
16

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

  • numel(M) эквивалентно prod(size(M)).
  • length(M) эквивалентно max(size(M)). Если M пусто (т.е. Любое измерение равно 0), то length(M) равно 0.
  • 4
    Обратите внимание, что если х = единицы (0, n); тогда max (размер (x)) -> n, а длина (x) -> 0
6

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

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

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

  • 2
    Хорошая перспектива - повышенная читаемость за минуту / незначительное увеличение производительности. +1
  • 7
    Когда я вижу, что используется NUMEL, я не предполагаю, что он используется в матрице по сравнению с вектором, я просто предполагаю, что он используется в объекте, для которого измерения не важны, и имеет значение только количество элементов.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню