Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 每n行连接一次_Matlab_Vector_Matrix - Fatal编程技术网

Matlab 每n行连接一次

Matlab 每n行连接一次,matlab,vector,matrix,Matlab,Vector,Matrix,我在矩阵中获得了如下数据集(从Excel导入): 我想把它重塑成3个相同大小的向量(每个类别一个)来做一个堆叠的条形图。在整形操作后,向量应该是这样的(如果向量具有第一列的名称,并且矩阵可以是任意大小,那就更好了): 我真诚地希望这不是重复。在其他重塑问题的帮助下,我无法生成有效的解决方案。如果您的数据是一个矩阵,您可以在索引时操纵行的顺序,因此您可以执行以下操作: rows = reshape(1:size(matrix, 1), n, []).'; res = reshape(matrix(

我在矩阵中获得了如下数据集(从Excel导入):

我想把它重塑成3个相同大小的向量(每个类别一个)来做一个堆叠的条形图。在整形操作后,向量应该是这样的(如果向量具有第一列的名称,并且矩阵可以是任意大小,那就更好了):


我真诚地希望这不是重复。在其他重塑问题的帮助下,我无法生成有效的解决方案。

如果您的数据是一个矩阵,您可以在索引时操纵行的顺序,因此您可以执行以下操作:

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}
where
L=unique(data(:,1)),它会更一般
length(L)
应等于
numel(groups)
@Sensei
ismember
查找原始数据中哪些行具有相同的“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