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

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

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

t = linspace(0,20,21)

над

t = 0:1:20

?

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

4b9b3361

Ответ 1

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

Функция 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 относительно оператора двоеточия.

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

linspace(0, 2*pi, 360)

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

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

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

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