Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.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中不同单元阵列数据的连接_Matlab_Merge - Fatal编程技术网

Matlab中不同单元阵列数据的连接

Matlab中不同单元阵列数据的连接,matlab,merge,Matlab,Merge,我在Matlab中有数据,是单元格数组格式,列表示不同的项。单元格数组具有不同的列,如以下示例所示: a = {'A', 'B', 'C' ; 1, 1, 1; 2, 2, 2 } a= b= 我希望能够以以下方式加入不同的单元阵列: c= 在实际示例中,我有数百列和几行,因此手动创建新的单元格数组对我来说不是一个选项。我假设您只想基于第一行连接两个数组 % get the list of all keys keys = unique([a(1,:) b(1,:)]); lena = siz

我在Matlab中有数据,是单元格数组格式,列表示不同的项。单元格数组具有不同的列,如以下示例所示:

a = {'A', 'B', 'C' ; 1, 1, 1; 2, 2, 2 }
a=

b=

我希望能够以以下方式加入不同的单元阵列:

c=


在实际示例中,我有数百列和几行,因此手动创建新的单元格数组对我来说不是一个选项。

我假设您只想基于第一行连接两个数组

% get the list of all keys
keys = unique([a(1,:) b(1,:)]);

lena = size(a,1)-1;  lenb = size(b,1)-1;

% allocate space for the joined array
joined = cell(lena+lenb+1, length(keys));

joined(1,:) = keys;

% add a
tf = ismember(keys, a(1,:));
joined(2:(2+lena-1),tf) = a(2:end,:);

% add b
tf = ismember(keys, b(1,:));
joined((lena+2):(lena+lenb+1),tf) = b(2:end,:);

这将为您提供连接的数组,但它有空单元格而不是NaN。我希望这没问题

如果您愿意将数据存储在数据集数组中(或为此将其转换为数据集数组),可以执行以下操作:

>> d1
d1 = 
    A    B    C
    1    1    1
    2    2    2
>> d2
d2 = 
    C    D
    3    3
    4    4
>> join(d1,d2,'Keys','C','type','outer','mergekeys',true)
ans = 
    A      B      C    D  
      1      1    1    NaN
      2      2    2    NaN
    NaN    NaN    3      3
    NaN    NaN    4      4

以下是我的解决方案,从一个问题改编为一个类似的问题(简单地转置行/列):

以下是结果(转置以匹配原始方向):


下面是使用统计工具箱中的类的解决方案:

aa = dataset([cell2mat(a(2:end,:)) a(1,:)])
bb = dataset([cell2mat(b(2:end,:)) b(1,:)])
cc = join(aa,bb, 'Keys',{'C'}, 'type','fullouter', 'MergeKeys',true)


是否希望成为a的前两列和c的其他列?但是只保持第一行的混合?嗨,petrichor,正如Emrea在下面所说的,我正在寻求加入基于第一行的单元阵列。谢谢。查看此页面:谢谢@Amro,我已经看到了您上面链接的页面,但是函数的解决方案与我要求的略有不同。@Andrew:现在您可以从下面的多个解决方案中进行选择
% get the list of all keys
keys = unique([a(1,:) b(1,:)]);

lena = size(a,1)-1;  lenb = size(b,1)-1;

% allocate space for the joined array
joined = cell(lena+lenb+1, length(keys));

joined(1,:) = keys;

% add a
tf = ismember(keys, a(1,:));
joined(2:(2+lena-1),tf) = a(2:end,:);

% add b
tf = ismember(keys, b(1,:));
joined((lena+2):(lena+lenb+1),tf) = b(2:end,:);
>> d1
d1 = 
    A    B    C
    1    1    1
    2    2    2
>> d2
d2 = 
    C    D
    3    3
    4    4
>> join(d1,d2,'Keys','C','type','outer','mergekeys',true)
ans = 
    A      B      C    D  
      1      1    1    NaN
      2      2    2    NaN
    NaN    NaN    3      3
    NaN    NaN    4      4
%# input cell arrays
a = {'A', 'B', 'C' ; 1, 1, 1; 2, 2, 2 };
b = {'C', 'D'; 3, 3; 4, 4};

%# transpose rows/columns
a = a'; b = b';

%# get all key values, and convert them to indices starting at 1
[allKeys,~,ind] = unique( [a(:,1);b(:,1)] );
indA = ind(1:size(a,1));
indB = ind(size(a,1)+1:end);

%# merge the two datasets (key,value1,value2)
c = cell(numel(allKeys), size(a,2)+size(b,2)-1);
c(:) = {NaN};                         %# fill with NaNs
c(:,1) = allKeys;                     %# available keys from both
c(indA,2:size(a,2)) = a(:,2:end);     %# insert 1st dataset values
c(indB,size(a,2)+1:end) = b(:,2:end); %# insert 2nd dataset values
>> c'
ans = 
    'A'      'B'      'C'    'D'  
    [  1]    [  1]    [1]    [NaN]
    [  2]    [  2]    [2]    [NaN]
    [NaN]    [NaN]    [3]    [  3]
    [NaN]    [NaN]    [4]    [  4]
aa = dataset([cell2mat(a(2:end,:)) a(1,:)])
bb = dataset([cell2mat(b(2:end,:)) b(1,:)])
cc = join(aa,bb, 'Keys',{'C'}, 'type','fullouter', 'MergeKeys',true)
cc = 
    A      B      C    D  
      1      1    1    NaN
      2      2    2    NaN
    NaN    NaN    3      3
    NaN    NaN    4      4