これは醜い方法です-そして、以下のよりクリーンな方法です(後で追加されます)。問題は、セル配列を扱うとすぐに (データ型が混在しているため (列は文字、次に数字)、生活が困難になることです。列名とデータが 2 つの別個の配列 (以下を参照) である構造を作成することで、おそらくより良い結果が得られますが、ここでは「解決策」を示します。2 つのデータセットの行数と列数を変えることで、生活を少し面白くしました。何かが壊れないようにするためです。
ds1 = {'a','bb','c';1,2,3};
ds2 = {'aa','c','d', 'e';2,3,4,5; 5,6,7,8};
cols = unique({ds1{1,:} ds2{1,:}});
ds3 = cols;
n1 = size(ds1,1) - 1;
%%
for ii = 1:size(ds1,2)
ci = find(cellfun(@(x) isequal(x, ds1{1,ii}), cols));
if numel(ci) > 0
for jj = 1:n1
ds3{1+jj,ci} = ds1{1+jj, ii};
end
end
end
n2 = size(ds2, 1) - 1;
for ii = 1:size(ds2,2)
ci = find(cellfun(@(x) isequal(x, ds2{1,ii}), cols));
if numel(ci) > 0
for jj = 1:n2
ds3{1+n1+jj,ci} = ds2{1+jj, ii};
end
end
end
結果のマージされた配列:
'a' 'aa' 'bb' 'c' 'd' 'e'
[1] [] [ 2] [3] [] []
[] [ 2] [] [3] [4] [5]
[] [ 5] [] [6] [7] [8]
確かに最適ではありません-しかし、それはあなたが求めたことを実行します...ループでこれを行うのは嫌いですが、それを回避する方法がわかりませんでした。「真の Matlab エキスパート」の 1 人がこれを見て吐き気を催し、巧妙な 1 行の回答を提供するように促されることを願っています。
編集私はこれについてもう少し考え、はるかに効率的なアルゴリズムを思いつきました:
% assuming column headers and data are in two separate arrays
ds1headers = {'a','bb','c'};
ds1data = [1 2 3; 2 3 4];
ds2headers = {'aa','c','d', 'e'};
ds2data = [2 3 4 5; 3 4 5 6; 4 5 6 7];
% as before, find unique column headers:
cols = unique({ds1headers{:} ds2headers{:}});
% convert to column numbers:
ds1conv = cellfun(@(x)find(ismember(cols, x)), ds1headers);
ds2conv = cellfun(@(x)find(ismember(cols, x)), ds2headers);
% now conversion is easy:
n1 = size(ds1data,1);
n2 = size(ds2data,1);
ds3data = zeros(n1+n2, numel(cols));
ds3data(1:n1, ds1conv) = ds1data;
ds3data(n1+(1:n2), ds2conv) = ds2data;
disp(cols)
disp(ds3data)
結果は
'a' 'aa' 'bb' 'c' 'd' 'e'
1 0 2 3 0 0
2 0 3 4 0 0
0 2 0 3 4 5
0 3 0 4 5 6
0 4 0 5 6 7
それはうまくいくように見えます-醜いループはありません...これは、以下の@Maglaのソリューションに少し似ていることがわかりました(更新を投稿したときは見ませんでしたが、最新の編集の前には明らかにそこにありました) - ただし、列名のセル配列とその他のいくつかの改善点があります。