在matlab中将字符串数组与相同的字符串组合在一起

时间:2015-02-27 10:46:59

标签: matlab

另一个可能是问题。

给出一个字符串数组

M = [a      b
    011     10
    001     10
    112      4
    015      2
    086      1
    117      1
    121      2]

你可以看到这些值是字符串而不是数字,  所以我想组合相同字符串的行,例如011和001具有相同的b,即10,所以这就是我想要的输出:

 T = [a        b
    011,001    10,10
    112        4
    015,121    2,2
    086,117    1,1]

因此你可以再次看到,011和001合并它们在同一个单元格中以及086和117,我想要一个输出,当你复制并粘贴到单词011和001或所有组合字符串必须是显示,如果你是nx 2字符串数组怎么办? 这意味着您不知道数组的行大小。 有可能吗?感谢

1 个答案:

答案 0 :(得分:2)

我的策略是将您的字符串转换为单元格。这是一个解决方案:

% --- Define M
M = [sprintf('%s\t%s\n', 'a', 'b') ...
    sprintf('%s\t%s\n', '011', '10') ...
    sprintf('%s\t%s\n', '001', '10') ...
    sprintf('%s\t%s\n', '112', '4') ...
    sprintf('%s\t%s\n', '015', '2') ...
    sprintf('%s\t%s\n', '086', '1') ...
    sprintf('%s\t%s\n', '117', '1') ...
    sprintf('%s\t%s\n', '121', '2')]

% --- Convert into cells
tmp = textscan(M, '%s\t%s\n');
C1 = tmp{1};            % First column
C2 = tmp{2};            % Second column

% --- Group

% Get unique values of the second column
UV = unique(C2, 'stable');

% Prepare result columns
R1 = {};
R2 = {};

% Group
for i = 1:numel(UV)

    b = ismember(C2, UV{i});
    R1{i,1} = strjoin(C1(b), ',');
    R2{i,1} = strjoin(C2(b), ',');

end

% --- Convert the result to a string
Res = '';
for i = 1:numel(R1)
    Res = [Res sprintf('%s\t%s\n', R1{i}, R2{i})];
end

Res字符串包含:

Res =

086,117 1,1
011,001 10,10
015,121 2,2
112 4
a   b

这不是您想要的输出,因为它没有排序。如果您希望对输出进行排序,请准确说明标准。


修改

我更正了代码,使输出按输入第二列定义的顺序显示。 'stable'的{​​{1}}参数可以解决问题。

输出现在是:

unique