【问题标题】:alternative to reshape or colon in matlab在matlab中替代重塑或冒号
【发布时间】:2014-12-25 10:28:08
【问题描述】:

我想将二维矩阵简化为行向量。

但是在大​​型矩阵中使用reshape 确实很慢。另一种选择是使用colon,但我希望矩阵的转置是冒号而不是矩阵本身。

例如

A=magic(3)

A =

     8     1     6
     3     5     7
     4     9     2

A(:) 将所有列一一堆叠。但我正在寻找这样的东西:

AA=A(2:3,:)';

然后重新整形或冒号 AA 而不是 A。

问题是我不想定义像AA 这样的额外变量。

在没有reshape的情况下,有没有办法减少二维矩阵的维数?

【问题讨论】:

  • 那么为什么不直接使用A(2:3,:)'(或A(2:end,:).')而不将其分配给变量呢?
  • 我怀疑不是 reshape 需要时间,而是需要将重塑后的矩阵复制到不同的内存位置。
  • @LuisMendo,我猜是因为 OP 最终希望它作为一维数组。
  • @A.Donda 知道了。谢谢

标签: matlab matrix reshape colon


【解决方案1】:

您可以通过线性索引来避免额外的变量。以您为例:

A([2 5 8 3 6 9])

给了

3  5  7  4  9  2

这里发生的情况是,您将 A 视为已经转换为向量,并且通过索引 1 到 9 访问该一维数组的元素。使用冒号是线性索引的一种特殊情况, A(:)A(1 : end) 相同。

找出正确的线性索引可能很棘手,但sub2ind 可以提供帮助。

这可能会稍微加快代码速度,主要是因为(如@Shai wrote)您避免将数据写入中间变量。不过,我不会期望太多。

【讨论】:

    【解决方案2】:

    尝试查看subsref。对于您的示例,您可以按如下方式使用它:

    subsref(A',struct('type','()','subs',{{2:3,':'}}))
    

    更新:我误解了原来的问题;我认为 OP 想从转置的 A 矩阵中选择 2:3 的行,保持列不变。我会保留之前的答案,以防它对其他人有用。

    我认为他/她可以使用以下方法对矩阵进行切片和展平:

    subsref(A(2:3,:)', struct('type','()','subs',{{':'}}))
    

    这将作为输出:

    [3 5 7 4 9 2]'

    【讨论】:

      猜你喜欢
      • 2013-08-09
      • 2014-06-01
      • 2016-01-11
      • 1970-01-01
      • 2019-09-14
      • 2015-02-27
      • 2014-11-24
      相关资源
      最近更新 更多