3

次のようなマトリックスのデータセットを取得しました (Excel からインポート):

matrix =
    Cat1   1  2  3  4
    Cat2   9 10 11 12
    Cat3  17 18 19 20
    Cat1   5  6  7  8
    Cat2  13 14 15 16
    Cat3  21 22 23 24

積み上げ棒グラフを作成するために、同じサイズの 3 つのベクトル (カテゴリごとに 1 つ) に形状を変更したいと思います。変形操作の後、ベクトルは次のようになります (ベクトルに最初の列の名前があり、行列が任意のサイズであると便利です)。

cat1 = [ 1  2  3  4  5  6  7  8]
cat2 = [ 9 10 11 12 13 14 15 16]
cat3 = [17 18 19 20 21 22 23 24]

これが重複していないことを心から願っています。他の再形成の質問の助けを借りて、実用的な解決策を生み出すことができませんでした。

4

2 に答える 2

2

データが行列の場合、インデックスを作成するときに行の順序を操作できるため、次のようにすることができます。

rows = reshape(1:size(matrix, 1), n, []).';
res = reshape(matrix(rows, :).', [], n).';

結果の行列resは、連結された行で構成されます。

このソリューションはセル配列にも当てはまりますがcell2mat、結果を行列に変換するには追加が必要です。

matrix = [1:4; 9:12; 17:20; 5:8; 13:16; 21:24];
n = 3;

rows = reshape(1:size(matrix, 1), n, []).';
res = reshape(matrix(rows, :).', [], n).';

結果は次のとおりです。

res =
     1     2     3     4     5     6     7     8
     9    10    11    12    13    14    15    16
    17    18    19    20    21    22    23    24
于 2013-05-08T10:30:50.330 に答える
1

編集:

次のことを試してください。

%# dataset stored in a cell array
data = {
    'Cat1'   1  2  3  4
    'Cat2'   9 10 11 12
    'Cat3'  17 18 19 20
    'Cat1'   5  6  7  8
    'Cat2'  13 14 15 16
    'Cat3'  21 22 23 24
};

%# get all possible values of first column,
%# and map them to integer indices
[L,~,IDX] = unique(data(:,1));

%# for each possible "category"
groups = cell(max(IDX),1);
for i=1:max(IDX)
    %# get the rows of numeric data matching current category
    M = data(IDX==i, 2:end)';

    %# flatten matrix into a vector and store in cell (row-major order)
    groups{i} = [M{:}];
end

これで、i 番目の「cat」ベクトルに次のようにアクセスできます。groups{i}

>> [cat1,cat2,cat3] = deal(groups{:})
cat1 =
     1     2     3     4     5     6     7     8
cat2 =
     9    10    11    12    13    14    15    16
cat3 =
    17    18    19    20    21    22    23    24

一致する "cat" ラベルはL{i}(マッピング キー)に格納されることに注意してください。

于 2013-05-08T10:52:26.553 に答える