【问题标题】:MatLab: Need to add a ' \t' (tab char) every 4 chars in a stringMatLab:需要在字符串中每 4 个字符添加一个“\t”(制表符)
【发布时间】:2014-02-20 20:34:20
【问题描述】:

再次感谢大家昨天的帮助,我很感激。但是我的 MatLab 编程仍然存在一些问题。

背景

我有一个很长的字符串(200k+ 个字符)需要解析。这一切都是十六进制的,我需要让 MatLab 来绘制它。我正在尝试分解步骤。我需要在这个字符串中每 4 个字符放一个 '\t' (tab char)。

不过,让我们忘记我现在真正需要做的事情吧。让我们专注于更一般的事情。说我的字符串是:

abcdefghijklmnopqrstuvwxyz

我想让 MatLab 输出:

abcd efgh ijkl mnop qrst uvwx yz

我可怜的尝试

for k = 4:length(Vader)
    Vader = horzcat(Vader(1:k), ' ', Vader(k+1:end))
    k= k+5;
end
Vader

这个输出:

abcd                         efghijklmnopqrstuvwxyz

在 abcd 和 efghijk...等之间有 26 个 ' '(空格字符)。 当我尝试这个时:

k= 4;
Vader = horzcat(Vader(1:k), ' ', Vader(k+1:end))
k= k+5;
Vader = horzcat(Vader(1:k), ' ', Vader(k+1:end))
k= k+5;
Vader = horzcat(Vader(1:k), ' ', Vader(k+1:end))
k= k+5;
.....etc

输出是:

abcd efgh ijkl mnop qrst uvwx yz

完全正确!

发生了什么事?

为什么 for 循环与写出我的所有步骤不同?他们在我看来是一样的。我搞不清楚了。此外,我需要为任何字符串、我想放入的任何字符(\t、\n、'somechars'等)和任何长度的字符串执行此操作。我的最终目标是让它处理 4 个字符的十六进制字符串,每组 6 个,最后有 2 个停止/开始字符(总共 28 个字符)

感谢您的任何帮助,我很感激。

编辑

我是个笨蛋:

for k = 4:5:(length(Vader))
    Vader = horzcat(Vader(1:k), char(13), Vader(k+1:end));
    k = k+1; 
end
Vader

我需要这个 stepsize 部分

k = 4:5:(length(Vader))

vs 我的旧代码

k = 4:(length(Vader))

但是这不会循环整个事情。正如下面的评论者指出的那样,长度(Vader)部分在开始时被初始化。然后代码将在达到所需的输出之前停止,并且字符串现在比最初的要长。

关于如何强制长度(Vader)部分在每个循环中更新的任何想法?谢谢。

编辑 2:

好的,知道了!您必须预先计算最终字符串的长度,并将其作为“for”循环的限制:

jarJar = 4;         %how many in string you want to skip over
luke = ceil(length(Vader)*((1+jarJar)/jarJar));
for hanSolo = jarJar:(1+jarJar):luke
    Vader = horzcat(Vader(1:hanSolo), ' ', Vader(hanSolo+1:end));
    hanSolo = hanSolo+1; 
end
Vader

ceil() 部分很重要。您可以获得小数值,并且您想要超过最终字符串长度的末尾,而不是在它下面(因为 floor() 会给您)。

感谢 Bob Gilman 的帮助和大脑采摘。有一只有时可以和你说话的橡皮鸭真的很有帮助。

【问题讨论】:

  • 我的第一反应是说你想使用for k=1:4:length(Vader)(注意我使用的是begin:stepsize:end范围语法,而不是你使用的begin:end语法),但甚至那是不对的。请记住,for 循环条件中的length(Vader) 将被评估一次循环开始执行之前。但是当循环结束时,Vader 会更长,所以你不会真正循环到Vader 的末尾。
  • 感谢 Bob Gilmore 提供的 'begin:stepsize:end' 条件。我也遇到了 for 循环在开始时评估大小而不是整个循环的问题。我将尝试一个嵌套了“for”循环的“while”循环,看看它在哪里。我希望我记得在这里发布答案
  • Bob Gilamn,请参阅我上面的编辑以获取解决方案。您必须先计算最终字符串的长度,然后将其用作 for 循环的限制
  • @user3320919 您应该发布您找到的解决方案作为您问题的答案,然后接受它,以便阅读问题的人立即认识到您的问题已经解决。
  • 好的,会的!谢谢

标签: string matlab


【解决方案1】:

你可以使用reshape将字符串变成一个4列的矩阵,然后将一列制表符连接到它;然后转换回来。

这是一个例子,给定你的起始字符串:

>> str = 'abcdefghijklmnopqrstuvwxyz';

请注意,length(str) 是 26,它不能被 4 整除。为了解决这个问题,让我们找出距离下一个可被 4 整除的数字有多远。然后我们将在字符串中添加那么多空格。这是必要的,因为reshape 在操作前后获得相同数量的元素;它不会为了使大小正确而添加更多元素。

>> numSpaces = 4 - mod(length(str), 4)
numSpaces = 
    2
>> str = [str repmat(' ', [1 numSpaces])];

现在,让我们reshape。 Reshape 按列操作,因此我们需要转置输出。

>> reshapedStr = reshape(str, 4, []).'
reshapedStr = 
abcd
efgh
ijkl
mnop
qrst
uvwx
yz

然后,单独创建一个新的列向量tabs,其长度与reshapedStr相同:

>> tabs(1:length(reshapedStr), 1) = sprintf('\t');

将此列连接到我们的数组:

>> reshapedStr = [reshapedStr tabs];

并将其重新整形(请注意,我们转置 reshapedStr,因为它按列操作,而不是按行操作)

>> finalStr = reshape(reshapedStr.', 1, [])
finalStr = 
abcd    efgh    ijkl    mnop    qrst    uvwx    yz

如果需要,您也可以删除最后的空格和制表符 yz

【讨论】:

  • 这是一个很好的起点,更类似于我实际需要做的事情。谢谢!但是,对于奇数长度的字符串,您需要 numSpaces = 4 - mod(length(str), 4)。我假设我传入的字符串将是奇数或偶数长度。不过,非常感谢你,这实际上是我正在努力的下一步,但失败了,你已经在没有我问的情况下为我回答了。 Dang Khoa,你就是男人! cdn.breitbart.com/mediaserver/Breitbart/Big-Government/2013/…
【解决方案2】:
jarJar = 4;         %how many in string you want to skip over
luke = ceil(length(Vader)*((1+jarJar)/jarJar));
for hanSolo = jarJar:(1+jarJar):luke
    Vader = horzcat(Vader(1:hanSolo), ' ', Vader(hanSolo+1:end));
    hanSolo = hanSolo+1; 
end
Vader

这是一种很好的方法,请参阅上面的编辑以获取更详细的说明。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2011-01-05
    相关资源
    最近更新 更多