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 关于冒号操作符的一些陈述.
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以查看它的确切功能.
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有助于创建自定义颜色映射