在matlab中替换整形或冒号

c90pui9n  于 2023-01-26  发布在  Matlab
关注(0)|答案(2)|浏览(179)

我想把一个二维矩阵简化为行向量。
但是对大矩阵使用reshape确实很慢,另一种选择是使用colon,但是我希望矩阵的转置是冒号而不是矩阵本身。
例如:

A=magic(3)

A =

     8     1     6
     3     5     7
     4     9     2

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

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

然后重新整形或冒号AA代替A。
问题是我不想定义像AA这样的附加变量。
没有reshape的二维矩阵有什么降维方法吗?

cwxwcias

cwxwcias1#

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

A([2 5 8 3 6 9])

它给出了

3  5  7  4  9  2

这里的情况是,您将A视为已转换为向量,并且通过索引1到9访问此一维数组的元素。使用冒号是线性索引的一种特殊情况,A(:)A(1 : end)相同。
计算出正确的线性索引可能很棘手,但sub2ind可以帮助解决这个问题。
这可能会稍微加快代码的速度,主要是因为(如@Shai所写)您避免了将数据写入中间变量。

ar7v8xwq

ar7v8xwq2#

试着看看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]

相关问题