A = [1,4,2,5,10
2,4,5,6,2
2,1,5,6,10
2,3,5,4,2]
そして、最後の列 A -> B と C で 2 つの行列に分割したい
B = [1,4,2,5,10
2,1,5,6,10]
C = [2,4,5,6,2
2,3,5,4,2]
また、この方法は、行列 100*22 のような大きな行列に、最後の列の値に従って、matlab によって 9 つのグループに適用できます。
論理インデックスを使用する
B=A(A(:,end)==10,:);
C=A(A(:,end)==2,:);
戻り値
>> B
B =
1 4 2 5 10
2 1 5 6 10
>> C
C =
2 4 5 6 2
2 3 5 4 2
編集:ダンのコメントへの返信として、ここに一般的なケースの拡張があります
e = unique(A(:,end));
B = cell(size(e));
for k = 1:numel(e)
B{k} = A(A(:,end)==e(k),:);
end
またはよりコンパクトな方法
B=arrayfun(@(x) A(A(:,end)==x,:), unique(A(:,end)), 'UniformOutput', false);
だから
A =
1 4 2 5 10
2 4 5 6 2
2 1 5 6 10
2 3 5 4 2
0 3 1 4 9
1 3 4 5 1
1 0 4 5 9
1 2 4 3 1
セル配列の要素で行列を取得しますB
>> B{1}
ans =
1 3 4 5 1
1 2 4 3 1
>> B{2}
ans =
2 4 5 6 2
2 3 5 4 2
>> B{3}
ans =
0 3 1 4 9
1 0 4 5 9
>> B{4}
ans =
1 4 2 5 10
2 1 5 6 10
accumarray
と組み合わせて使用histc
:
% Example data (from Mohsen Nosratinia)
A = [...
1 4 2 5 10
2 4 5 6 2
2 1 5 6 10
2 3 5 4 2
0 3 1 4 9
1 3 4 5 1
1 0 4 5 9
1 2 4 3 1];
% Get the proper indices to the specific rows
B = sort(A(:,end));
[~,b] = histc(A(:,end), B([diff(B)>0;true]));
% Collect all specific rows in their specific groups
C = accumarray(b, (1:size(A,1))', [], @(r) {A(r,:)} );
結果:
>> C{:}
ans =
1 3 4 5 1
1 2 4 3 1
ans =
2 3 5 4 2
2 4 5 6 2
ans =
0 3 1 4 9
1 0 4 5 9
ans =
2 1 5 6 10
1 4 2 5 10
ご了承ください
B = sort(A(:,end));
[~,b] = histc(A(:,end), B([diff(B)>0;true]));
のように書くこともできます
[~,b] = histc(A(:,end), unique(A(:,end)));
ただし、unique
組み込みではないため、特にこれがすべてループで使用されている場合は遅くなる可能性があります。
また、行の順序が元の行列の順序から変更されていることにも注意してください。順序が重要な場合は、別のものを投入する必要がありますsort
:
C = accumarray(b, (1:size(A,1))', [], @(r) {A(sort(r),:)} );