您可以使用cell-arrays 来解决这类问题。当所有列或所有行的长度不相等时,使用元胞数组。每行/列可以有不同的大小。它们不需要填充来使它们的大小都相等。
一种使用accumarray的方法
[~,~,idx] = unique(A(:,1));
outC = accumarray(idx,A(:,2),[],@(x) {x.'}) %//'
%// If you want the outputs in sorted order use the following code instead
%// outC = accumarray(idx,A(:,2),[],@(x) {sort(x).'})
outC =
[1x2 double]
[1x2 double]
[ 31]
[ 25]
您可以使用outC{1} 之类的语法访问每个单元格
>> outC{1}
ans =
46 34
如果你想一次查看整个矩阵,你可以使用celldisp函数
>> celldisp(outC)
outC{1} =
46 34
outC{2} =
23 45
outC{3} =
31
outC{4} =
25
如果您想将输出作为NaN 填充矩阵而不是单元格数组,您可以执行以下操作(在您获得上面的outC 之后):
使用bsxfun 和cellfun 的方法
lens = cellfun(@numel,outC);
maxSize = max(lens);
out = nan(maxSize,numel(outC));
mask = bsxfun(@le,(1:maxSize).',lens(:).')
out(mask) = horzcat(outC{:});
out = out.'
输出:
out =
46 34
23 45
31 NaN
25 NaN
如果您使用替代方法(输出排序)找到outC,结果将是:
out =
34 46
23 45
31 NaN
25 NaN