0

假设我有一个 3 维数组A = rand(3, 4, 5);,我想提取一个 vector A(1,1,:)。如果我这样写,输出是一个 size 的 3D 数组,[1 1 5]而不是一个 size 的普通向量[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
    

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

4

2 回答 2

2

挤压会做同样的事情,但适用于任何维度。 http://www.mathworks.de/de/help/matlab/ref/squeeze.html

>> b=squeeze(A(1,1,:));
>> size(b)
ans =
     5     1

我意识到,这不是完全相同的东西。挤压返回一个列向量,而另一个答案产生一个行向量。然而 B(1,:) = b; 作品。

于 2013-06-15T16:17:04.053 回答
1

使用permute

B = permute(A,order)重新排列 A 的维度,使其按照向量 order 指定的顺序。B 具有与 A 相同的值,但访问任何特定元素所需的下标顺序按照 order 指定的方式重新排列。order 的所有元素必须是唯一的、实数、正数、整数值。

>> subA = permute(A, [1 3 2]);
>> size(subA)
ans = 

    1    5
于 2013-06-15T15:47:33.953 回答