冒号运算符在 MATLAB 中如何工作?

2024-02-26

如中所述山姆·罗伯茨的回答 https://stackoverflow.com/a/26297279/7328782 and gnovice 的另一个答案 https://stackoverflow.com/a/5779438/7328782, MATLAB 冒号运算符 (start:step:stop)以不同的方式创建值向量linspace做。萨姆·罗伯茨特别指出:

冒号运算符将起点加上增量,并从终点减去减量以到达中间点。这样就保证了输出向量尽可能对称。

然而,The MathWorks 的相关官方文档已从其网站上删除。

如果 Sam 的描述是正确的,那么步长的误差不是对称的吗?

>> step = 1/3;
>> C = 0:step:5;
>> diff(C) - step
ans =
   1.0e-15 *
  Columns 1 through 10
         0         0    0.0555   -0.0555   -0.0555    0.1665   -0.2776    0.6106   -0.2776    0.1665
  Columns 11 through 15
    0.1665   -0.2776   -0.2776    0.6106   -0.2776

关于冒号运算符需要注意的有趣事项:

  • 它的值取决于它的长度:

    >> step = 1/3;
    >> C = 0:step:5;
    >> X = 0:step:3;
    >> C(1:10) - X
    ans =
       1.0e-15 *
             0         0         0         0         0   -0.2220         0   -0.4441    0.4441         0
    
  • 如果四舍五入,它可以生成重复的值:

    >> E = 1-eps : eps/4 : 1+eps;
    >> E-1
    ans =
       1.0e-15 *
       -0.2220   -0.2220   -0.1110         0         0         0         0    0.2220    0.2220
    
  • 最后一个值有一个容差,如果步长创建了一个刚好高于结束值的值,则仍然使用这个结束值:

    >> A = 0 : step : 5-2*eps(5)
    A =
      Columns 1 through 10
             0    0.3333    0.6667    1.0000    1.3333    1.6667    2.0000    2.3333    2.6667    3.0000
      Columns 11 through 16
        3.3333    3.6667    4.0000    4.3333    4.6667    5.0000
    >> A(end) == 5 - 2*eps(5)
    ans =
      logical
       1
    >> step*15 - 5
    ans =
         0
    

所引用的已删除页面萨姆的回答 https://stackoverflow.com/a/26297279/7328782还是由 Wayback Machine 存档 https://web.archive.org/web/20121120071523/http://www.mathworks.com/support/solutions/en/data/1-4FLI96/index.html?solution=1-4FLI96。幸运的是,即使是附带的 M 文件colonop也有吗。而且这个函数似乎仍然与 MATLAB 的功能相匹配(我使用的是 R2017a):

>> all(0:step:5 == colonop(0,step,5))
ans =
  logical
   1
>> all(-pi:pi/21:pi == colonop(-pi,pi/21,pi))
ans =
  logical
   1

我将在这里复制该函数对一般情况的作用(有一些用于生成整数向量和处理特殊情况的快捷方式)。我将函数的变量名替换为更有意义的变量名。输入是start, step and stop.

首先它计算中间有多少步start and stop。如果最后一步超过stop超过公差,则不采取:

n = round((stop-start)/step);
tol = 2.0*eps*max(abs(start),abs(stop));
sig = sign(step);
if sig*(start+n*step - stop) > tol
  n = n - 1;
end

这解释了问题中提到的最后一个观察结果。

接下来,它计算最后一个元素的值,并确保它不超过stop值,即使它允许在之前的计算中超过它。

last = start + n*step;
if sig*(last-stop) > -tol
   last = stop;
end

这就是向量中的 lasat 值的原因A问题中实际上有stop值作为最后一个值。

接下来,它分两部分计算输出数组,如广告所示:数组的左半部分和右半部分独立填充:

out = zeros(1,n+1);
k = 0:floor(n/2);
out(1+k) = start + k*step;
out(n+1-k) = last - k*step;

请注意,它们不是通过递增来填充的,而是通过计算整数数组并将其乘以步长来填充,就像linspace做。这解释了对数组的观察E在问题中。不同之处在于,数组的右半部分是通过从数组中减去这些值来填充的。last value.

最后一步,对于奇数大小的数组,单独计算中间值以确保它恰好位于两个端点的中间:

if mod(n,2) == 0
   out(n/2+1) = (start+last)/2;
end

功能齐全colonop被复制在底部。


请注意,分别填充数组的左侧和右侧并不意味着步长的误差应该完全对称。这些误差由舍入误差给出。但它确实有所不同stop与数组的情况一样,步长无法精确到达点A在问题中。在这种情况下,稍短的步长是在数组的中间而不是末尾采用的:

>> step=1/3;
>> A = 0 : step : 5-2*eps(5);
>> A/step-(0:15)
ans =
   1.0e-14 *
  Columns 1 through 10
         0         0         0         0         0         0         0   -0.0888   -0.4441   -0.5329
  Columns 11 through 16
   -0.3553   -0.3553   -0.5329   -0.5329   -0.3553   -0.5329

但即使在这种情况下stop准确地到达点,中间会积累一些额外的误差。以数组为例C在问题中。此错误累积不会发生linspace:

C = 0:1/3:5;
lims = eps(C);
subplot(2,1,1)
plot(diff(C)-1/3,'o-')
hold on
plot(lims,'k:')
plot(-lims,'k:')
plot([1,15],[0,0],'k:')
ylabel('error')
title('0:1/3:5')
L = linspace(0,5,16);
subplot(2,1,2)
plot(diff(L)-1/3,'x-')
hold on
plot(lims,'k:')
plot(-lims,'k:')
plot([1,15],[0,0],'k:')
title('linspace(0,5,16)')
ylabel('error')

colonop:

function out = colonop(start,step,stop)
% COLONOP  Demonstrate how the built-in a:d:b is constructed.
%
%   v = colonop(a,b) constructs v = a:1:b.
%   v = colonop(a,d,b) constructs v = a:d:b.
%
%   v = a:d:b is not constructed using repeated addition.  If the
%   textual representation of d in the source code cannot be
%   exactly represented in binary floating point, then repeated
%   addition will appear to have accumlated roundoff error.  In
%   some cases, d may be so small that the floating point number
%   nearest a+d is actually a.  Here are two imporant examples.
%
%   v = 1-eps : eps/4 : 1+eps is the nine floating point numbers
%   closest to v = 1 + (-4:1:4)*eps/4.  Since the spacing of the
%   floating point numbers between 1-eps and 1 is eps/2 and the
%   spacing between 1 and 1+eps is eps,
%   v = [1-eps 1-eps 1-eps/2 1 1 1 1 1+eps 1+eps].
%
%   Even though 0.01 is not exactly represented in binary,
%   v = -1 : 0.01 : 1 consists of 201 floating points numbers
%   centered symmetrically about zero.
%
%   Ideally, in exact arithmetic, for b > a and d > 0,
%   v = a:d:b should be the vector of length n+1 generated by
%   v = a + (0:n)*d where n = floor((b-a)/d).
%   In floating point arithmetic, the delicate computatations
%   are the value of n, the value of the right hand end point,
%   c = a+n*d, and symmetry about the mid-point.

if nargin < 3
    stop = step;
    step = 1;
end

tol = 2.0*eps*max(abs(start),abs(stop));
sig = sign(step);

% Exceptional cases.

if ~isfinite(start) || ~isfinite(step) || ~isfinite(stop)
   out = NaN;
   return
elseif step == 0 || start < stop && step < 0 || stop < start && step > 0
   % Result is empty.
   out = zeros(1,0);
   return
end

% n = number of intervals = length(v) - 1.

if start == floor(start) && step == 1
   % Consecutive integers.
   n = floor(stop) - start;
elseif start == floor(start) && step == floor(step)
   % Integers with spacing > 1.
   q = floor(start/step);
   r = start - q*step;
   n = floor((stop-r)/step) - q;
else
   % General case.
   n = round((stop-start)/step);
   if sig*(start+n*step - stop) > tol
      n = n - 1;
   end
end

% last = right hand end point.

last = start + n*step;
if sig*(last-stop) > -tol
   last = stop;
end

% out should be symmetric about the mid-point.

out = zeros(1,n+1);
k = 0:floor(n/2);
out(1+k) = start + k*step;
out(n+1-k) = last - k*step;
if mod(n,2) == 0
   out(n/2+1) = (start+last)/2;
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

冒号运算符在 MATLAB 中如何工作? 的相关文章

  • Matlab:保存后翻转图例顺序和图例重叠图

    我正在尝试根据以下内容反转我的图例条目顺序matlab条形图中图例颜色的逆序 https stackoverflow com questions 31178005 reverse ordering of legend colors in m
  • 为什么旋转 3D 点云后顶点法线会翻转?

    我有两个人脸 3D 点云样本 蓝色点云表示目标面 红色点云表示模板 下图显示目标面和模板面在不同方向上对齐 目标面大致沿 x 轴 模板面大致沿 y 轴 Figure 1 The region around the nose is displ
  • 在 MATLAB 中重命名文件

    我正在尝试以编程方式重命名工作目录中的文件a temp txt to b hello txt 您建议如何这样做 MATLAB中有一个简单的文件重命名函数吗 我认为您正在寻找 MOVEFILE
  • Matlab没有优化以下内容吗?

    我有一个很长的向量 1xrv 和一个很长的向量w1xs 和一个矩阵Arxs 它是稀疏的 但维度非常大 我期望 Matlab 对以下内容进行优化 这样我就不会遇到内存问题 A v w 但看起来 Matlab 实际上是在尝试生成完整的v w矩阵
  • 两个向量之间的欧氏距离(单行矩阵)

    我有两个向量 单行矩阵 假设我们已经知道长度len A x1 x2 x3 x4 x5 B y1 y2 y3 y4 y5 计算它们之间的欧几里德距离最快的方法是什么 我的第一次尝试是 diff A B sum 0 for column 1 l
  • 在 Matlab 中高效获取像素坐标

    我想在 Matlab 中创建一个函数 给定一个图像 该函数将允许人们通过单击图像中的像素来选择该像素并返回该像素的坐标 理想情况下 人们能够连续单击图像中的多个像素 并且该函数会将所有相应的坐标存储在一个矩阵中 有没有办法在Matlab中做
  • 检测植物图片中的所有分支

    我想知道有什么可以检测下图中的所有绿色树枝 目前我开始应用 Frangi 过滤器 options struct FrangiScaleRange 5 5 FrangiScaleRatio 1 FrangiBetaOne 1 FrangiBe
  • 如何找到平面和 3d 矩阵之间的交平面

    如果我有一堆图像并且尺寸如下 size M 256 256 124 我有 3 个点 它们的坐标是 coor a 100 100 124 coor b 256 156 0 coor c 156 256 0 如何创建 M 与这 3 个点定义的平
  • 如何在 matlab 中创建由多个 3d 图像数据数组组成的数组

    我正在阅读 15 张图片imagedata imread imagename jpg 它的大小总是320 by 320 by 3 如何将数据放入数组中 使用 for for 循环 以便在访问新数组的第一个元素时获得输入的第一个图像的 RGB
  • 如何更改Plotyy第二轴的颜色和字体大小?

    我使用 MATLAB 的plotyy 函数绘制了两条曲线 AX H1 H2 plotyy voltage span amplitude voltage span Ca SR The problem is that I cannot chan
  • 如何在文本集中创建所有字符组合?

    例如 我有这样的文本集 第 1 栏 a b 第 2 栏 l m n 第 3 栏 v w x y 我想将它们组合起来以获得如下输出 alv alw alx aly amv amw amx amy 这将输出 24 种文本组合 如果我只使用前两列
  • @(t)在Matlab中是什么意思? [复制]

    这个问题在这里已经有答案了 正如标题所示 考虑到下面的上下文 t 在 Matlab 中到底意味着什么 computeNumericalGradient 是一个函数 cofiCostFunc 也是一个接受一堆参数的函数 问题是 t 对 cof
  • 使用 PDFBox 在 PDF 上绘制矢量图像

    我想使用 Apache PDFBox 在 PDF 上绘制矢量图像 这是我用来绘制常规图像的代码 PDPage page PDPage document getDocumentCatalog getAllPages get 1 PDPageC
  • 快速有效地计算已知特征值的特征向量

    我的问题的简短版本 计算矩阵特征向量的最佳方法是什么A 如果我们已经知道属于特征向量的特征值呢 更长的解释 我有一个很大的随机矩阵A由于它是随机的 因此具有非负左特征向量x 这样A Tx x 我正在寻找快速有效的方法来数值计算这个向量 最好
  • MATLAB 类的 Description 和DetailedDescription 属性

    内置 MATLAB 类具有 Description 和 DetailedDescription 属性的值 gt gt handle ans meta class handle Package meta Properties Name han
  • 如何在 MATLAB 中绘制纹理映射三角形?

    我有一个三角形 u v 图像中的坐标 我想在 3D 坐标处绘制这个三角形 X Y Z 与图像中的三角形进行纹理映射 Here u v X Y Z都是具有三个元素的向量 代表三角形的三个角 我有一个非常丑陋 缓慢且令人不满意的解决方案 其中我
  • 检测分段常数信号中的阶跃

    我有一个分段恒定信号 如下所示 我想检测步骤转换的位置 标记为红色 我目前的做法 使用移动平均滤波器平滑信号 http www mathworks com help signal examples signal smoothing html
  • 如何使用SIFT算法计算两幅图像的相似度?

    我已经用过SIFT http en wikipedia org wiki Scale invariant feature transform实施安德里亚 维达尔迪 http www vlfeat org overview sift html
  • scipy distance_transform_edt 函数如何工作?

    https docs scipy org doc scipy 0 14 0 reference generated scipy ndimage morphology distance transform edt html https doc
  • 在不知道大小的情况下在Matlab中预分配空间?

    我正在构建一个向量X在 Matlab 中 通过将循环过程中每次迭代的结果连接起来 我现在正在做的是 X for j 1 N do something that delivers a vector A X X A end 不可能先验地预测 A

随机推荐

  • Xcode 13 中的 Info.plist 在哪里? (缺失,不在项目导航器内)

    有谁知道如何添加 编辑值Info plistXcode 13 还没到吗 我看到他们移动了Info plist从导航器窗格 但是虽然我可以找到它 但我不知道如何编辑它 这是一个 功能 你不再需要它了 来自发行说明 https develope
  • 运行进程时隐藏 vb.net 中的命令窗口

    如果我有这个代码 Send file to Unix server via pscp Dim Proc As New System Diagnostics Process Proc StartInfo New ProcessStartInf
  • 不小心把代码发布了。如何防止再次发生?

    最近我们发生了一起事件 一些原本没有计划发布的代码被发布了 显然它已经被托运到行李箱里了 我想这很好 如你所愿 提早入住 经常入住 然而在这种情况下 它不应该在下一个版本中发布 可以采取什么样的检查 策略 流程来避免代码过早发布 在我看来
  • 使用 Post/Redirect/Get 模式保留模型状态

    目前我正在尝试使用 Spring MVC 3 1 实现 Post Redirect Get 模式 保存和恢复模型数据 验证错误的正确方法是什么 我知道我可以在 POST 方法中使用 RedirectAttributes 保留模型和 Bind
  • Python 在标签正则表达式处分割

    我正在尝试拆分这些行
  • SQL 中的 LIMIT 语句有多通用?

    我正在推广 Django DB 复制应用程序 它使用以下语句 SELECT s FROM s LIMIT 1 获取 1 行并使用 Python DBAPI 来描述字段 它可以在 ORACLE 和 MySQL 中正常工作 但是 LIMIT 语
  • 创建共现矩阵

    我正在尝试解决共现矩阵的问题 我有一个交易和项目的数据文件 我想查看项目一起出现的交易数量的矩阵 我是 R 编程的新手 我很高兴发现 R 拥有的所有快捷方式 而不是创建特定的循环 我几年前曾经使用 C 现在只坚持使用 Excel 宏和 SP
  • H264解析-切片头检测

    我知道在 h264 中我们可以通过位模式检测 NAL 单元0x000001 是否有等效的方法来检测 NAL 单元中的切片标头 如何处理多切片 NAL 单元 目前我正在使用 h264 的解析代码并获取相应结构中的切片标头 切片头语法在第 36
  • 模式匹配 - Prolog 与 Haskell

    这不是一个家庭作业问题 而是一个考试学习指导问题 Prolog 与 Haskell 中的模式匹配有什么区别 我做了一些研究并阅读了它们背后的理论并没有真正让我对两者有一个坚实的理解 我在Prolog中读到 模式匹配是不同的 因为它具有统一变
  • 需要更好的算法来查找 2 组具有最小距离的点之间的映射

    Problem 我有两个重叠的 2D 形状 A 和 B 每个形状具有相同数量的像素 但形状不同 形状的某些部分是重叠的 而每个形状的某些部分是不重叠的 我的目标是将形状 A 中的所有不重叠像素移动到形状 B 中的不重叠像素 由于每个形状中的
  • 网站图像文件是否应该包含在 GIT 存储库中?

    我有一个网站文件 文件夹结构模板可以开始使用git 它包含一个空的 gitignore文件内的images文件夹 这引出了我的两部分问题 1 这个是空的吗 gitignore文件忽略所有位于的图像inside the images文件夹 或
  • Pandas 就地操作 DataFrame 与非就地操作 DataFrame (inplace=True vs False) [重复]

    这个问题在这里已经有答案了 我想知道当我们选择就地操作数据帧时 与没到位 我在 Stack Overflow 上做了一些搜索 发现了这个post https stackoverflow com questions 43893457 pyth
  • 将 Objective-C 对象作为 void * 指针传递给函数

    我有一个功能 myFunction MyProc callback void ref 该函数是从 Objective C 类中调用的 该函数传递一个指向回调 类中的函数 的指针和一个引用 该引用是必要的 因为回调是静态调用的 因此没有上下文
  • 哪个 C/C++ 头文件定义了 BYTE 数据类型?

    我正在使用此声明移植标头 struct tMaterialInfo char strName 255 the texture name char strFile 255 the texture BYTE color 3 the color
  • 观看模板文件并将其复制到 dist/ 文件夹

    我在我的项目中使用打字稿 我可以成功观看 编译 ts 文件并将它们输出到dist folder 这里是scripts我的一部分package json start npm run build npm run watch build npm
  • 如何提取这个多态递归函数?

    我正在使用 GHC 7 8 做一些相当有趣的事情 但遇到了一些问题 我有以下内容 mkResultF Eq k gt Query kvs KV k v gt k gt ResultF Reverse kvs Maybe v mkResult
  • 通过重复元素分割数组的最 Pythonic 方法

    我有一个要根据分隔符拆分的项目列表 我希望删除所有分隔符并在出现时拆分列表分隔符出现两次 例如 如果分隔符是 X 然后是以下列表 a b X X c d X X f X g 会变成 a b c d f g 请注意 最后一组没有拆分 我已经编
  • 插入数据库 php 后表情符号显示为问号

    我使用utf8mb4作为编码 character set connection和character set database已设置为utf8mb4 我的网页的字符集设置为utf8 我使用了 PDO 当我打开数据库连接时 我使用 utf8mb
  • 仅使用 javascript 生成并保存/下载文件 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 冒号运算符在 MATLAB 中如何工作?

    如中所述山姆 罗伯茨的回答 https stackoverflow com a 26297279 7328782 and gnovice 的另一个答案 https stackoverflow com a 5779438 7328782 MA