根据一列创建子矩阵组

时间:2015-04-14 13:14:59

标签: arrays matlab matrix

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

我有这个矩阵:

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)

等等。

提前致谢

3 个答案:

答案 0 :(得分:4)

这是accumarray的工作:

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

out = [ofGroup values]

enter image description here

要访问结果,您可以使用deal out。但我宁愿重新思考并直接使用单元格数组>> out{3,2} ans = 1 3 2 2 3 1

{{1}}

答案 1 :(得分:4)

这是另一种方法:

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

答案 2 :(得分:2)

您可以使用unique& arrayfun -

[~,~,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等的新矩阵,则可以使用{{3} }(将输入分配给输出) -

>> [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