假设我有一个三维数组A = rand(3, 4, 5);
,我想提取一个向量A(1,1,:)
。如果我这样写,输出是一个大小为[1 1 5]
的3D数组,而不是大小为[1 5]
的普通向量。例如,这不允许我将其分配给另一个子数组B(1,:)
(导致“订阅分配维度不匹配”)。在不保留原始尺寸的情况下提取矢量的最佳方法是什么?
我可以想到两种方法:
计算所需元素的线性索引,而不是使用下标:
targetInds = 1:5;
fixedInds = repmat(1,size(targetInds));
inds = sub2ind(size(A), fixedInds, fixedInds, targetInds);
size(A(inds))
ans =
1 5
使用reshape
:
subA = reshape(A(1,1,:),1,size(A,3));
size(subA)
ans =
1 5
第二种方法似乎更容易,但我猜它的效率较低,而且它们都需要额外的代码。有更简单的方法吗?
答案 0 :(得分:2)
Squeeze将做同样的事情,但适用于任何维度。 http://www.mathworks.de/de/help/matlab/ref/squeeze.html
>> b=squeeze(A(1,1,:));
>> size(b)
ans =
5 1
我意识到,这不是完全相同的事情。 squeeze返回一个列向量,而另一个答案产生一个行向量。然而B(1,:) = b;的工作原理。
答案 1 :(得分:1)
使用permute
:
B = permute(A,order)
重新排列A的维度,使它们按矢量顺序指定的顺序排列。 B具有相同的A值,但访问任何特定元素所需的下标顺序按顺序重新排列。订单的所有元素必须是唯一的,真实的,正的,整数的值。
>> subA = permute(A, [1 3 2]);
>> size(subA)
ans =
1 5