В чем преимущество linspace над двоеточием: «оператор?

Есть ли какое-то преимущество в написании

t = linspace(0,20,21) 

над

 t = 0:1:20 

?

Я понимаю, что первый создает вектор, как это делает первый.
Может ли кто-нибудь указать мне некоторую ситуацию, когда linspace полезна при t = 0:1:20 ?

Это не просто удобство использования. Хотя в документации говорится:

Функция linspace генерирует линейно разнесенные векторы. Он аналогичен оператору двоеточия:, но дает прямой контроль над количеством точек.

это то же самое, основное отличие и преимущество linspace заключается в том, что он генерирует вектор целых чисел с требуемой длиной (или значением по умолчанию 100) и затем масштабирует его до требуемого диапазона. Обозначение : двоеточие создает вектор напрямую с помощью приращений.

Представьте, что вам нужно определить края бункера для гистограммы. И особенно вам нужно, чтобы определенный край 0.35 был точно в нужном месте:

 edges = [0.05:0.10:.55]; X = edges == 0.35 edges = 0.0500 0.1500 0.2500 0.3500 0.4500 0.5500 X = 0 0 0 0 0 0 

не определяет правый край бункера, но:

 edges = linspace(0.05,0.55,6); %// 6 = (0.55-0.05)/0.1+1 X = edges == 0.35 edges = 0.0500 0.1500 0.2500 0.3500 0.4500 0.5500 X = 0 0 0 1 0 0 

делает.

Ну, это в основном проблема с плавающей точкой. Который можно избежать с помощью linspace , поскольку одно деление целого не является таким деликатным, как совокупная сумма чисел флотирования. Но, как отметил Марк Дикинсон в комментариях: вы не должны полагаться на то, что вы считаете, что вы ожидаете. Это не то, что нужно для Linspace. По-моему, это вопрос того, насколько вероятны проблемы с плавающей точкой и насколько вы можете уменьшить вероятность для них или насколько малы вы можете установить допуски. Использование linspace может уменьшить вероятность возникновения этих проблем, это не безопасность.

Это код linspace :

 n1 = n-1 c = (d2 - d1).*(n1-1) % opposite signs may cause overflow if isinf(c) y = d1 + (d2/n1).*(0:n1) - (d1/n1).*(0:n1) else y = d1 + (0:n1).*(d2 - d1)/n1 end 

Подводя итог: linspace и двоеточие надежны при выполнении различных задач. linspace пытается обеспечить (как следует из названия) линейное расстояние, тогда как colon пытается обеспечить симметрию

В вашем специальном случае, когда вы создаете вектор целых чисел, нет преимущества linspace (кроме удобства использования ), но когда дело доходит до деликатных задач с плавающей запятой, может быть.

Ответ Сэма Робертса дает дополнительную информацию и разъясняет дальнейшие вещи, в том числе некоторые утверждения MathWorks относительно оператора двоеточия .

linspace и оператор двоеточия делают разные вещи.

linspace создает вектор целых чисел указанной длины, а затем масштабирует его до заданного интервала с делением. Таким образом, он гарантирует, что выходной вектор будет как можно более линейным.

Оператор двоеточия добавляет приращения к начальной точке и вычитает декременты от конечной точки для достижения средней точки. Таким образом, он гарантирует, что выходной вектор максимально симметричен.

Таким образом, два метода имеют разные цели и часто дают очень немного разные ответы, например

 >> a = 0:pi/1000:10*pi; >> b = linspace(0,10*pi,10001); >> all(a==b) ans = 0 >> max(ab) ans = 3.5527e-15 

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

См. Техническую ноту MathWorks для более подробной информации об алгоритме, лежащем в основе оператора двоеточия. Для более подробной информации о linspace вы можете просто набрать edit linspace чтобы точно увидеть, что он делает.

linspace полезно, когда вы знаете количество элементов, которые хотите, а не размер «шага» между ними. Поэтому, если я сказал, сделайте вектор с 360 элементами между 0 и 2*pi в качестве надуманного примера, он либо будет

 linspace(0, 2*pi, 360) 

или если у вас просто был оператор двоеточия, вам придется вручную вычислить размер шага:

 0:(2*pi - 0)/(360-1):2*pi 

linspace просто удобнее

Для простого приложения реального мира см. Этот ответ, где linspace полезно при создании пользовательской цветовой карты

  • Какие хорошие право-ассоциативные методы в Scala?
  • Списки инициализаторов и RHS операторов
  • jQuery выбирает атрибут с использованием операторов AND и OR
  • Реализация операторов сравнения через «tuple» и «tie» - хорошая идея?
  • Почему выражение a = a + b - (b = a) дает предупреждение о точке последовательности в c ++?
  • Что делает оператор ^ в Java?
  • Какова категория значений операндов операторов C ++, когда они не указаны?
  • Как перегрузить оператор квадратной скобки в C #?
  • Является ли оператор экспоненты в C #?
  • Как работает оператор побитового дополнения (~ тильда)?
  • Рекомендации по приоритету Java-операторов
  • Interesting Posts

    Невозможно выполнить поиск по долларовым суммам, находящимся в имени файла.

    Пакетный скрипт получает html-сайт и анализирует контент (без wget, curl или другого внешнего приложения)

    Строки и столбцы Bootstrap. Нужно ли использовать строку?

    Получить количество циклов процессора?

    T-SQL выбирает запрос для удаления нечисловых символов

    Как заставить Windows 7 переключаться между программами быстрее через какое-то время?

    Android-устройство GPS вкл. / Выкл. Программно

    Когда следует использовать Lazy ?

    Обход ограничения размера файла FAT32 4 ГБ

    Имитация клавиатуры с API-интерфейсом SendInput в приложениях DirectInput

    MATLAB: Возможно ли перегрузить операторы по собственным конструкциям (ячейкам, структурам и т. Д.)?

    Как связать угловой ui с помощью сервера через $ http для оптимизации на стороне сервера?

    Удалить все, кроме регулярного выражения в Vim

    Почему vim не подчиняется моему расширению в файлах python?

    Как найти адрес моего DNS-сервера в Windows 7

    Давайте будем гением компьютера.