【问题标题】:Sub-array dimensions 1-by-1-by-N子阵列尺寸 1×1×N
【发布时间】:2013-06-15 15:40:12
【问题描述】:

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

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

【问题讨论】:

    标签: matlab


    【解决方案1】:

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

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

    我知道,这不是一回事。挤压返回一个列向量,而另一个答案产生一个行向量。然而 B(1,:) = b;有效。

    【讨论】:

    • 完美!这是我找不到的术语:单例维度。
    【解决方案2】:

    使用permute:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-21
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多