在Matlab中,当x是一个向量时,x = x(:)的含义是将x转换为列向量。

12
这是一个难以通过谷歌搜索得到答案的问题。我刚接触Matlab并看到了下面的语句,但我不知道它的作用。x = x(:)的作用是什么?
答:x = x(:) 的作用是将矩阵x转变为列向量。
7个回答

15
:冒号操作符。在这个上下文中,它将x重新整形为一维列向量。
因此,这段代码:
x = [ 1 3
      2 4 ];

x = x(:);

disp(x)

结果是:

1
2
3
4

你知道它是否只是进行了重塑(因此会进行写时复制),还是在那一点上强制进行复制(即使x已经是列)? - robince
@robince:好问题。我想x(:)应该完全等同于reshape(x, [], 1)。但我不确定(我不确定这是否有记录)。我猜可以通过分析来尝试弄清楚。 - Oliver Charlesworth
是的,我检查过了,似乎具有正常的写时复制语义(使用2011b版本)。我不知道为什么我会认为它强制进行复制 - 也许它在过去某个时候确实如此。 - robince

2

3
实际上,使用 Google 并不难。 - voidengine

2

这种语法通常用于确保x是一个列向量:

x = x(:)

同样地,这行代码确保x是一个行向量。
x = x(:)'

2

正如其他人所说,x(:)会将x转换为向量,特别是列向量。这样做的重点在于,它使您的代码能够应对用户意外提供行向量的情况。例如:

x = 1:5;

创建了一个行向量。有些操作需要列向量。由于x(:)对于已经是列向量的向量什么也不做,这是编写健壮、稳定代码的一种方式。

当然,如果x是一个3x4矩阵,它仍然会将x转换为长度为12的列向量,因此最好的代码需要测试这样的情况,如果这是一个问题的话。


1
这个运算符告诉Matlab尝试转换数据类型。
例如:
两种数据类型设置为不同的类型:
>> foo = uint8(0);

>> bar = double(0);

使用“whos”命令检查数据类型:

>> whos foo bar
  Name      Size            Bytes  Class     Attributes

  bar       1x1                 8  double              
  foo       1x1                 1  uint8               

使用 (:) 运算符将 uint8 赋值给 double:
>> bar(:) = foo;

并且它仍然是一个双精度浮点数

>> whos foo bar
  Name      Size            Bytes  Class     Attributes

  bar       1x1                 8  double              
  foo       1x1                 1  uint8   

将unit8赋值给double,不使用(:)运算符:

>> bar = foo;

并且它会变成一个uint8数据类型:

>> whos foo bar
  Name      Size            Bytes  Class     Attributes

  bar       1x1                 8  uint8      
  foo       1x1                 1  uint8      

1
如果x是一个矩阵,比如下面这个3*3的矩阵:
    x=[1,2,3;4,5,6;7,8,9];
    x=x(:);

语句x=x(:)将矩阵列出为列向量。输出如下:

    1
    2
    3
    4
    5
    6
    7
    8    
    9

当x为行向量时,得到的结果与此相同。
因此一般来说,x(:)将x的元素列为列向量。

1

x(:) 重新塑造您的矩阵。

因此,如果您的矩阵是

1 2 3
5 6 7
8 9 10

调用 x=x(:)x 设置为

1
5
8 
2
6
9
3
7
10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接