将char数组分成N个相等的部分matlab

时间:2017-07-24 06:52:43

标签: arrays matlab matrix split char

我有一个char数组,例如:

a = '123456abced5421f'

我希望将它分成相等的部分(例如b(1) = '123456ab'b(2) = 'ced5421f'),所以当我调用b(1)时,它将返回8个元素而不仅仅是1个元素。

我怎样才能在Matlab中做到这一点?

我尝试使用单元格数组并重新整形,单元格数组会增加数组的大小,所以我不想使用它,重塑只返回1个元素。

2 个答案:

答案 0 :(得分:2)

您可以使用reshape将字符串转换为字符矩阵,即包含多行和8列:

a = '123456abced5421f';
b = reshape(a,8,[]).'
>> b = 
     ['123456ab'
      'ced5421f']

然后使用标准行索引

访问每一行(8个字符串)
b(1,:) % Row 1, all columns
>> ans = '123456ab'

如果您真的希望能够使用单个索引访问每一行,则必须使用单元格数组。要将b转换为所需的单元格数组,我们可以使用mat2cell

c = mat2cell(b, [1 1], 8);

然后索引很容易

c{1}
>> ans = '123456ab'

所有这些都没有定义b,并使其成为通用的:

% number of elements in a must be divisible by 8
c = mat2cell(reshape(a,8,[]).', ones(1, numel(a)/8), 8);

答案 1 :(得分:2)

如果你想获得arrary,不使用单元格数组,请使用辅助函数:

a = '123456abced5421f';
b = @(n) a((n-1)*8+1:(n*8));

现在您可以输入:

>> b(1)
ans =
    '123456ab'
>> b(2)
ans =
    'ced5421f'

如果您想要少于或多于8个元素,只需将其设置为变量:

m = 16; % or any other integer number
b = @(n) a((n-1)*m+1:(n*m));

这种方法的优点是它不消耗内存(帮助函数可以忽略不计),因为你不创建任何新变量。

如果您希望能够在一次调用中访问b中的多个元素,那么最好使用临时数组(使用@Wolfies answer中建议的行索引) :

m = 8;
tmp = reshape(a,m,[]).';
b = @(n) tmp(n,:);

然后你可以输入:

>> b(1:2)
ans =
  2×8 char array
    '123456ab'
    'ced5421f'