【问题标题】:access cell array by two vector not pairwise通过两个非成对向量访问元胞数组
【发布时间】:2015-08-02 14:06:59
【问题描述】:

如果我有一个 2*2 元胞数组,其中 A{i,j} 是一个矩阵,并且我有两个向量 v=1:2,c=1:2。

我希望 A(v,c) 只返回 A{1,1} 和 A{2,2} 但 matlab 返回两者的每个组合(也返回 A{1,2} 和 A{2, 1})。

有没有不使用循环或 cellfun 的方法?

【问题讨论】:

    标签: matlab cell-array


    【解决方案1】:

    我怀疑你在做什么是这样的:

    B = A(v, c);
    

    当您指定要索引到A 的向量时,它会找到坐标的交点 并为您提供这些元素。因此,通过您的索引,您基本上会返回 A 中的所有元素。

    如果您只想要左上角和右下角的元素,请改用sub2ind。您可以获取元胞数组中这些位置的主要列索引,然后使用这些索引切入元胞数组:

    ind = sub2ind(size(A), v, c);
    B = A(ind);
    

    示例

    让我们创建一个示例 2 x 2 元胞数组:

    A = cell(2,2);
    A{1,1} = ones(2);
    A{1,2} = 2*ones(2);
    A{2,1} = 3*ones(2);
    A{2,2} = 4*ones(2);
    

    第 1 行第 1 列是一个全为 1 的 2 x 2 矩阵。第 1 行第 2 列是一个 2 x 2 矩阵,第 2 行第 1 列是一个全 3 的 2 x 2 矩阵,最后一个条目是一个全 4 的 2 x 2 矩阵。

    使用v = 1:2; c=1:2;,运行上面的代码给我们:

    >> celldisp(B)
    
    B{1} =
    
         1     1
         1     1
    
    B{2} =
    
         4     4
         4     4
    

    如您所见,我们准确地选择了左上角和右下角的条目。

    小提示

    如果它只是一个 2 x 2 的元胞数组,而你只想挑选左上角和右下角的元素,你可以这样做:

    B = A([1 4]);
    

    sub2ind 将等效地返回 1 和 4 作为左上角和右下角元素的列主索引。这避免了sub2ind 调用,仍然可以实现您想要的。

    【讨论】:

      猜你喜欢
      • 2018-09-28
      • 1970-01-01
      • 2019-11-20
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多