linspace比冒号":"运算符有什么优势?

coo*_*ool 18 arrays matlab operators

写作有一些优势吗?

t = linspace(0,20,21)
Run Code Online (Sandbox Code Playgroud)

过度

t = 0:1:20
Run Code Online (Sandbox Code Playgroud)

我理解前者会产生一个矢量,就像第一个那样.
任何人都可以告诉我一些linspace有用的情况t = 0:1:20吗?

the*_*alk 20

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

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
Run Code Online (Sandbox Code Playgroud)

没有定义正确的bin边缘,但是:

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
Run Code Online (Sandbox Code Playgroud)

确实.

嗯,这基本上是一个浮点问题.这可以通过以下方法避免linspace,作为一个单一的整数分割不是细腻,像floting点号的累积和.但正如Mark Dickinson在评论中指出的那样: 你不应该依赖任何计算值正是你所期望的.这不是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
Run Code Online (Sandbox Code Playgroud)

总结一下:linspace冒号在完成不同的任务时是可靠的.linspace试图确保(顾名思义)线性间距,而colon试图确保对称性

在你的特殊情况下,当你创建一个整数向量时,除了可用性之外没有任何优点,但是当涉及到浮点微妙的任务时,可能会有.linspace

Sam Roberts的答案提供了一些额外的信息并澄清了更多内容,包括MathWorks 关于冒号操作符的一些陈述.

  • `== 0.35`推理有点狡猾:这种平等恰好在运气方面运气好 - 浮点错误恰好在这种情况下取​​消了.例如,如果用0.15替换0.35,那么比较会发生什么? (4认同)
  • 不:我不建议依赖*任何*的计算值*正好*你所期望的.我认为这不是linspace的用途.对于我来说,"linspace"的最大优点是你知道你将获得多少点,以及这些点将具有的间距(直到数字误差).相比之下,浮点错误可能会使(例如)`0.05:0.1:0.55`的最后一点变得不可预测. (3认同)

Sam*_*rts 9

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
Run Code Online (Sandbox Code Playgroud)

然而,在实践中,除非您对微小的数字细节感兴趣,否则差异往往影响不大.我觉得linspace更方便,当缺口的数量是容易表达,而我发现结肠操作时更方便的增量是容易表达.

有关冒号运算符背后算法的更多详细信息,请参见MathWorks技术说明.有关更多详细信息linspace,您只需键入edit linspace以查看它的确切功能.


Dan*_*Dan 7

linspace在您知道所需元素数量而不是它们之间的"步长"的大小时很有用.因此,如果我说制作一个包含360个元素的矢量,0并且2*pi作为一个人为的例子,它将会是

linspace(0, 2*pi, 360)
Run Code Online (Sandbox Code Playgroud)

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

0:(2*pi - 0)/(360-1):2*pi
Run Code Online (Sandbox Code Playgroud)

linspace 更方便

对于简单的真实世界应用程序,请参阅此答案,其中linspace有助于创建自定义颜色映射

  • 你能解决一个一个错误,以便两个表达式对应吗?`linspace(0,2*pi,361)`或`0:(2*pi - 0)/ 359:2*pi`. (2认同)