【发布时间】: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 您应该发布您找到的解决方案作为您问题的答案,然后接受它,以便阅读问题的人立即认识到您的问题已经解决。
-
好的,会的!谢谢