В чем преимущество linspace над двоеточием: «оператор?
Есть ли какое-то преимущество в написании
t = linspace(0,20,21)
над
t = 0:1:20
?
- Есть ли условный тернарный оператор в VB.NET?
- Сравнение равенств между несколькими переменными
- Каковы основные правила и идиомы для перегрузки оператора?
- Логический оператор XOR в C ++?
- Что означает функция%>% в R?
Я понимаю, что первый создает вектор, как это делает первый.
Может ли кто-нибудь указать мне некоторую ситуацию, когда linspace
полезна при t = 0:1:20
?
- Почему «оператор void» не вызывается с синтаксисом броска?
- Перегрузка оператора в C ++ как int + obj
- Зачем использовать оператор Bitwise-Shift для значений в определении enum C?
- Что такое i = (i, ++ i, 1) + 1; делать?
- Что делает оператор запятой?
- Можно ли передавать арифметические операторы методу в java?
- Что делает C ??! ??! оператор?
- Как различаются операторы сравнения с равенством равенства (== double equals) и идентичности (=== triple equals)?
Это не просто удобство использования. Хотя в документации говорится:
Функция
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
полезно при создании пользовательской цветовой карты