子阵列尺寸为1乘1比N

时间:2013-06-15 15:40:13

标签: matlab

假设我有一个三维数组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
    

第二种方法似乎更容易,但我猜它的效率较低,而且它们都需要额外的代码。有更简单的方法吗?

2 个答案:

答案 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