【问题标题】:Create groups of sub-matrices according to one column根据一列创建子矩阵组
【发布时间】:2015-04-14 21:48:32
【问题描述】:

我想知道如何从 Matlab 中的矩阵开始创建矩阵组。

我有这个矩阵:

A= [  1     1     2
     1     2     3
     1     3     4
     2     1     3
     2     2     4
     2     3     5
     3     1     4
     3     2     5
     3     3     6]

现在我想创建几个新矩阵,其中每个新矩阵的元素是 A 中每一行的前两列,它们具有 A 的第三列。

对于这种情况将是:

Af1=[1 1] % elements in common '2' (third column of A)
Af2= [1 2
      2 1] % elements in common '3' (third column of A)

等等。

提前致谢

【问题讨论】:

    标签: arrays matlab matrix


    【解决方案1】:

    这是另一种方法:

    B = sortrows(A, size(A,2)); %// sort rows acording to last column
    gs = diff(find(diff([inf; B(:,3); inf])~=0)); %// sizes of groups determined by last col
    result = mat2cell(B(:,1:end-1), gs); %// split according to those group sizes
    

    【讨论】:

    • 非常有趣的方法!想知道它是否会比 accumarray 固定?
    • @thewaywewalk 谁知道...无论如何,accumarray 是解决这个问题的完美选择。只是你们选的比较早! :-)
    【解决方案2】:

    这是accumarray的工作:

    [ofGroup,~,subs] = unique(A(:,3));
    values  = accumarray(subs,1:size(A,1),[],@(x) {A(x,[1,2])});
    
    out = [ofGroup values]
    

    要访问结果,您可以使用 approach proposed by Divakardeal。但我宁愿重新考虑并直接使用单元格数组out

    >> out{3,2}
    
    ans =
    
         1     3
         2     2
         3     1
    

    【讨论】:

    • 非常感谢,但是从 Matlab 中,工作区 id 中的“out”只是可见的,而我需要使用从上述过程中获得的矩阵进行操作。我该怎么办?
    • 不是ofgroup 只是unique 的第一个输出吗?
    • @Dan 观察得很好!谢谢。如果订单很重要并且需要使用unique(A(:,3),'stable') 因为accumarray 不稳定,它就不起作用。
    • accumarray 在这个问题上看起来很优雅!
    【解决方案3】:

    您可以使用uniquearrayfun 的一种方法-

    [~,~,idx] = unique(A(:,3),'rows','stable')
    out  = arrayfun(@(n) A(idx==n,1:2),1:max(idx),'Uni',0)
    

    使用celldisp 验证输出 -

    >> celldisp(out)
    out{1} =
         1     1
    out{2} =
         1     2
         2     1
    out{3} =
         1     3
         2     2
         3     1
    out{4} =
         2     3
         3     2
    out{5} =
         3     3
    

    或者,如果您已经知道要拥有多少个组,并且希望将每个这样的单元格保存为名称为 Af1Af2 等的新矩阵,您可以使用 deal(将输入分配到输出) -

    >> [Af1,Af2,Af3,Af4,Af5] = deal(out{:})
    Af1 =
         1     1
    Af2 =
         1     2
         2     1
    Af3 =
         1     3
         2     2
         3     1
    Af4 =
         2     3
         3     2
    Af5 =
         3     3
    

    【讨论】:

    • 完美,只是最后一个问题。现在,如果我有行数和列数未知的通用矩阵 A(总是知道用于对其他列进行分类的列)?怎么可能成为最后的办法? (例如,未来矩阵数量不确定的通用示例)
    • @ftrash 但是如果您不知道未来矩阵的数量,那么您打算如何使用这些变量呢?元胞数组或结构确实是最好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多