【问题标题】:The meaning of colon operator in MATLABMATLAB中冒号运算符的含义
【发布时间】:2010-10-21 19:55:03
【问题描述】:

我遇到了一些我不完全理解的带有冒号的 MATLAB 语法。

第一个问题:

表达式:0:pi/4:pi 结果得到答案:0 0.7854 1.5708 2.3562 3.1416

为什么会这样?我认为冒号运算符用作引用索引的快速方法,这样我们就不必写出完整的列表。 (例如1:3 -> 1 2 3

第二个问题:

与上面类似,假设我有一个矩阵X = [1 2 3 4 5 6 7 8 9]。如何解释表达式X(:,1:3)?具体来说,没有左右数字的冒号运算符是什么意思?

【问题讨论】:

标签: matlab


【解决方案1】:

其实a:b会生成一个向量。您只能将其用作索引,因为 (...) 也接受列表,例如

octave-3.0.3:10> a = [1,4,7]
a =

   1   4   7

octave-3.0.3:11> b = [1,4,9,16,25,36,49]
b =

    1    4    9   16   25   36   49

octave-3.0.3:12> b(a)    # gets [b(1), b(4), b(7)]
ans =

    1   16   49

现在,a:b:c 语法等价于 [a, a+b, a+2*b, ...] 直到 c,例如

octave-3.0.3:15> 4:7:50
ans =

   4  11  18  25  32  39  46

这解释了您在0:pi/4:pi 中获得的内容。


一个单独的: 选择整个轴(行/列),例如

octave-3.0.3:16> a = [1,2,3;4,5,6;7,8,9]
a =

   1   2   3
   4   5   6
   7   8   9

octave-3.0.3:17> a(:,1)   # means a(1:3, 1)
ans =

   1
   4
   7

octave-3.0.3:18> a(1,:)   # means a(1, 1:3)
ans =

   1   2   3

有关详细信息,请参阅colon (:) 上的官方 MATLAB 文档。

【讨论】:

  • @KennyTM:请记住a:b:c 并不总是与[a a+b a+b+b .. c] 相同;试试这个例子:x=0; for i=1:10, x=x+0.1; end 那么如果你比较 x==1 它将返回 false,因为累积的浮点数不准确(实际上 abs(x-1)1e-16 的顺序)
  • @Amro:我认为您的 for 循环与 a:b:c 语法没有任何关系。
  • @KennyTM:好吧,如果你想准确一点,那么将 y = 0:0.1:1; 与 for 循环:x(1)=0; for i=1:10, x(i+1)=x(i)+0.1; end 进行比较,你会发现 all(x==y) 并不总是正确的
  • @Amro:没错,但是a:b:c 是使用mathworks.com/support/solutions/en/data/1-4FLI96/… 构造的
  • @KennyTM:这正是我要说明的重点:在这种情况下,冒号运算符不会重复添加,而是小心地安排最后一个元素恰好是结束号。 .
【解决方案2】:

KennyTM 回答我的两便士。

实际上 MATLAB 中的标量和向量变量具有二维。标量有 1 行 1 列,向量有 1 行或 1 列。试试size(X)

用于索引的冒号 (:) 运算符仅表示 all。语法 X(:,1:3) 表示获取从 1 到 3 的所有行和列。由于您的变量 X 只有 1 行,因此您将在该行中获得前 3 个值。

【讨论】:

  • 矩阵可以有任意维度;例如A=rand(6,5,4,8,3) 创建一个带有随机数字的 5 维矩阵。然后,执行A(:,2,4,:,2) 是从该 5D 矩阵中获取特定 2D 切片的完全合理的语法。
  • 按 MATLAB 定义“所有 MATLAB 变量都是多维数组,无论是什么类型的数据。矩阵是二维数组,常用于线性代数。” link。也可以试试ismatrix(rand(2,3,2))。你是对的,冒号运算符可以应用于数组的任何维度。
  • 让我再补充一点:试试x=1;size(x,4567)
  • 正如我的评论:“所有 MATLAB 变量都是多维数组”。我只是反对对二维以上的数组使用术语矩阵。
猜你喜欢
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 2013-11-28
  • 2016-10-12
相关资源
最近更新 更多