【问题标题】:What is the advantage of linspace over the colon ":" operator?与冒号“:”运算符相比,linspace 有什么优势?
【发布时间】:2014-12-05 05:25:52
【问题描述】:

写作有什么好处吗

t = linspace(0,20,21)

结束

t = 0:1:20

?

我知道前者会产生一个向量,就像第一个一样。
谁能告诉我linspacet = 0:1:20 有用的情况?

【问题讨论】:

  • 一种是你可以指定元素的数量,N需要linspace,所以如果给你N,你就省去了计算步长的麻烦。顺便说一句,使用前一种情况的好方法是t=linspace(0,20,N)
  • 我猜你是想写t=linspace(0,20,20)。请编辑问题以帮助未来的读者。
  • linspace(0, 20, 21) 更适合0:1:20

标签: arrays matlab operators


【解决方案1】:

linspace 在您知道元素数量而不是它们之间“步长”的大小时很有用。因此,如果我说在 02*pi 之间创建一个包含 360 个元素的向量作为一个人为的例子,它要么是

linspace(0, 2*pi, 360)

或者如果您只有冒号运算符,则必须手动计算步长:

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

linspace只是更方便

对于一个简单的现实世界应用程序,请参阅此答案,其中linspace 有助于创建custom colour map

【讨论】:

  • 你能修正一个错误,使两个表达式对应吗? linspace(0, 2*pi, 361)0:(2*pi - 0)/359:2*pi
【解决方案2】:

这不仅仅是可用性。虽然文档说:

linspace 函数生成线性间隔的向量。它是 类似于冒号运算符 :,但可以直接控制 点数。

也一样,linspace 的主要区别和优势在于它会生成一个具有所需长度(或默认为 100)的 整数 向量并在之后对其进行缩放强> 到所需的范围。 : 冒号直接按增量创建向量。

假设您需要为直方图定义 bin 边缘。尤其是您需要将某个 bin 边缘 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 可以避免 ,因为整数的单次除法并不像浮点数的累积和那样精细。但正如马克·迪金森在 cmets 中指出的那样: 您不应该依赖任何与您所期望的完全一致的计算值。这不是 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(除了usability没有优势,但是当涉及到浮点精细任务时,有可能是。

The answer of Sam Roberts 提供了一些附加信息并澄清了进一步的事情,包括 MathWorks regarding the colon operator 的一些陈述。

【讨论】:

  • +1 用于显示冒号和 linspace 之间的区别,其中一个有效,另一个无效。
  • == 0.35 的推理有点狡猾:这种相等性恰好起作用主要是运气——在这种情况下,浮点错误恰好被抵消了。例如,如果您将 0.35 替换为 0.15,那么在比较中会发生什么?
  • 这是一个问题的可能性有多大。你有更好的例子吗?
  • 否:我不建议依赖 任何 的计算值 完全 你所期望的。我认为这不是 linspace 的用途。 linspace 对我来说最大的优势是你知道你将获得多少点,以及这些点的间距(直到数字错误)。相比之下,浮点错误可能会让人无法预测(例如)0.05:0.1:0.55 的最后一个点实际上是什么。
  • @MarkDickinson 我会尽量采纳你的建议并在下班后澄清我的回答;)
【解决方案3】:

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 technical note,了解有关冒号运算符背后算法的更多详细信息。有关linspace 的更多详细信息,您只需输入edit linspace 即可查看其具体功能。

【讨论】:

  • 这个答案应该澄清更多的事情;)+1
  • MW 网站的链接已损坏。您是否有更新的链接或有关冒号运算符的其他信息?我的经验不是它向后工作,最后一个元素可以包含或不包含,具体取决于步长。
  • @CrisLuengo 这很烦人,看起来他们记下了技术说明。我会尝试找到另一个参考。
  • 关于冒号运算符如何工作的详细信息:stackoverflow.com/q/49377234/7328782
猜你喜欢
  • 2016-07-04
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 2010-09-24
  • 2010-12-27
  • 2011-11-06
相关资源
最近更新 更多