【问题标题】:divide char array into N equal parts matlab将char数组分成N等份matlab
【发布时间】:2017-07-24 06:52:43
【问题描述】:

我有一个char数组,例如:

a = '123456abced5421f'

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

如何在 Matlab 中做到这一点?

我尝试使用元胞数组和 reshape,元胞数组会增加数组的大小,所以我不想使用它,reshape 只会返回 1 个元素。

【问题讨论】:

标签: arrays matlab matrix split char


【解决方案1】:

您可以使用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);

【讨论】:

  • 我不想使用元胞数组,因为它们会增加我的数组的大小,我希望大小保持不变
  • 然后使用此答案中所示的行索引,或使用辅助函数来缩短索引,如 EBH 所示
  • 谢谢它的工作......我的问题是我有一个文本,我想将它分成每个大小为 16 字节的块,然后加密每个块,但我不知道该使用什么char 类型会使位的大小加倍,我真的很困惑
  • 这个方法没问题,但是我的输入有另一个问题我希望加密算法一次处理每个16个字节,但我不知道我是否应该使用char类型作为算法的输入或 uint8 作为输入,使用 char 需要 8 个元素,使用 uint8 需要 16 个元素......有什么建议吗?
  • 听起来您想提出一个新问题,并提供一个很好的清晰示例来处理任何现有代码和您遇到的问题
【解决方案2】:

如果您想获得数组,但不使用单元数组,请使用辅助函数:

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'

【讨论】:

  • 不确定是否值得一提,取决于 OP(或未来访问者)的体验,像 b(1) = 'abcdefgh' 这样的分配操作无效,并且此方法本质上是“只读”。不过想法不错。
  • 从 OP 看来,这不是分配 =,而只是显示 b() 中的内容的一种方式
  • 是的,我同意,正如我所说的,只是为以后可能会发现此方法有用的访问者留个便条 :)
  • 我可以用你的方法将我的数组分成块然后取出每个块并处理它我希望每个块都被加密然后使用算法解密
  • 如果你只想访问a 8 个元素的块,你可以使用上面的第一个选项。如果您想一起处理所有部分,请使用第二个选项。 **无论哪种方式,如果你能更详细地解释你的目标,你会得到更好的答案。
猜你喜欢
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 2015-03-28
  • 2012-02-25
  • 2017-10-27
  • 1970-01-01
相关资源
最近更新 更多