Matlab 每n行连接一次
我在矩阵中获得了如下数据集(从Excel导入): 我想把它重塑成3个相同大小的向量(每个类别一个)来做一个堆叠的条形图。在整形操作后,向量应该是这样的(如果向量具有第一列的名称,并且矩阵可以是任意大小,那就更好了):Matlab 每n行连接一次,matlab,vector,matrix,Matlab,Vector,Matrix,我在矩阵中获得了如下数据集(从Excel导入): 我想把它重塑成3个相同大小的向量(每个类别一个)来做一个堆叠的条形图。在整形操作后,向量应该是这样的(如果向量具有第一列的名称,并且矩阵可以是任意大小,那就更好了): 我真诚地希望这不是重复。在其他重塑问题的帮助下,我无法生成有效的解决方案。如果您的数据是一个矩阵,您可以在索引时操纵行的顺序,因此您可以执行以下操作: rows = reshape(1:size(matrix, 1), n, []).'; res = reshape(matrix(
我真诚地希望这不是重复。在其他重塑问题的帮助下,我无法生成有效的解决方案。如果您的数据是一个矩阵,您可以在索引时操纵行的顺序,因此您可以执行以下操作:
rows = reshape(1:size(matrix, 1), n, []).';
res = reshape(matrix(rows, :).', [], n).';
结果矩阵res
由连接的行组成
此解决方案也适用于单元阵列,但需要额外的cell2mat
将结果转换为矩阵
例子
结果是:
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
编辑:
请尝试以下操作:
%# 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}
(映射键)是Cat1;Cat2…
等矩阵的一列,或者类别是否每n行重复一次?矩阵的类型是什么?单元格数组,数据集对象,…@Dan您的假设是正确的。@Amro I将数据作为单元格数组导入,因为矩阵选项将用NaN替换我的文本值。老实说,我不知道数据集类型是什么。与其使用data(:,1)
作为ismember
的第一个参数,我认为如果使用L{I}
whereL=unique(data(:,1)),它会更一般代码>length(L)
应等于numel(groups)
@Senseiismember
查找原始数据中哪些行具有相同的“Cat”字符串,然后将它们提取到新的单元格数组M
,连接在一起并存储在groups
@Amro中的相应单元格中,您应该考虑在“猫”字符串上应用“唯一”,而不是预先分配“代码>组< /代码>。然而,问题的标题是“每n行”,我认为使用“猫”字串是一种过激的行为。@Sensei是的,你可以。例如,用groups{1}{3}
@Sensei和其他人从第一行提取第三个值:谢谢,我实现了你的建议。我在每一步都添加了更多的注释。我已经测试了你的代码,它可以正常工作。非常感谢。我现在已经导入了不带标题的数据(cat1,cat2,…)@Sensei很棒。请考虑通过点击复选标记来标记这个问题。✓) 在投票按钮旁边。当然。关于Amro提供的解决方案,我还有几个问题。我是否还应该接受你的答案?@Sensei你应该接受对你最有帮助的答案,以表明其他用户正在寻求类似问题的答案。慢慢来:)
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
%# 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
>> [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