我有一个char数组,例如:
a = '123456abced5421f'
我希望将它分成相等的部分(例如b(1) = '123456ab'
和b(2) = 'ced5421f'
),所以当我调用b(1)
时,它将返回8个元素而不仅仅是1个元素。
我怎样才能在Matlab中做到这一点?
我尝试使用单元格数组并重新整形,单元格数组会增加数组的大小,所以我不想使用它,重塑只返回1个元素。
答案 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'