我想将二维矩阵缩减为行向量。
但是使用大型矩阵的reshape
非常慢。另一个选择是使用colon
,但我希望矩阵的转置是冒号而不是矩阵本身。
e.g。
A=magic(3)
A =
8 1 6
3 5 7
4 9 2
A(:)
将逐个堆叠所有列。但我正在寻找这样的事情:
AA=A(2:3,:)';
然后重塑或冒号AA而不是A.
问题是我不想定义像AA
这样的其他变量。
无论如何,在没有reshape
的情况下减少二维矩阵的维数?
答案 0 :(得分:1)
您可以通过线性索引来避免使用其他变量。以你的例子:
A([2 5 8 3 6 9])
给出了
3 5 7 4 9 2
这里发生的是你将A
视为已经转换为向量,并且通过索引1到9访问这个一维数组的元素。使用冒号是一个特例线性索引A(:)
与A(1 : end)
相同。
找出正确的线性指数可能很棘手,但sub2ind
可以帮助解决这个问题。
这可能会略微加速代码,主要是因为(作为@Shai wrote)避免将数据写入中间变量。不过,我不会期待太多。
答案 1 :(得分:0)
尝试查看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]'