Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String MatLab:需要添加一个'\t';(制表符字符)字符串中每4个字符_String_Matlab - Fatal编程技术网

String MatLab:需要添加一个'\t';(制表符字符)字符串中每4个字符

String MatLab:需要添加一个'\t';(制表符字符)字符串中每4个字符,string,matlab,String,Matlab,再次感谢你们昨天的帮助,我很感激。但是我的MatLab编程仍然存在一些问题 背景 我需要解析一个很长的字符串(200k+字符)。都是十六进制的,我需要用MatLab来绘制。我正试图打破这些台阶。我需要在此字符串中每隔4个字符放置一个“\t”(制表符) 不过,让我们忘了我现在真正需要做什么。让我们把重点放在更一般的事情上。假设我的字符串是: abcdefghijklmnopqrstuvwxyz 我想让MatLab输出: abcd efgh ijkl mnop qrst uvwx yz 我可怜的

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

背景

我需要解析一个很长的字符串(200k+字符)。都是十六进制的,我需要用MatLab来绘制。我正试图打破这些台阶。我需要在此字符串中每隔4个字符放置一个“\t”(制表符)

不过,让我们忘了我现在真正需要做什么。让我们把重点放在更一般的事情上。假设我的字符串是:

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'等)和任何长度的字符串执行此操作。我的最终目标是让它以6个字符为一组处理4个字符的十六进制字符串,末尾有2个停止/启动字符(总共28个字符)

谢谢你的帮助,我很感激

编辑

我是个笨蛋:

for k = 4:5:(length(Vader))
    Vader = horzcat(Vader(1:k), char(13), Vader(k+1:end));
    k = k+1; 
end
Vader
我需要这一步的份量

k = 4:5:(length(Vader))
vs我的旧代码

k = 4:(length(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()所示)

谢谢你的帮助,鲍勃·吉尔曼和脑力采摘。有一只橡皮鸭有时可以跟你顶嘴,这真的很有帮助。

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

下面是一个示例,给定您的起始字符串:

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

>> numSpaces = 4 - mod(length(str), 4)
numSpaces = 
    2
>> str = [str repmat(' ', [1 numSpaces])];
现在,让我们
重塑
。“重塑”按列操作,因此我们需要转置输出

>> reshapedStr = reshape(str, 4, []).'
reshapedStr = 
abcd
efgh
ijkl
mnop
qrst
uvwx
yz
然后,分别创建一个新的列向量
tabs
,其长度与
重塑str
相同:

>> tabs(1:length(reshapedStr), 1) = sprintf('\t');
将此列连接到我们的数组:

>> reshapedStr = [reshapedStr tabs];
并将其重新整形(请注意,我们转置
reformedstr
,因为它是按列操作的,而不是按行操作的)

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

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

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

我的第一反应是说你想用
表示k=1:4:length(Vader)
(注意,我使用的是
begin:stepsize:end
范围语法,而不是你使用的
begin:end
语法),但即使这样也不对。请记住,for循环条件中的
length(Vader)
将在循环开始执行之前计算一次。但是当循环结束时,
Vader
将更长,因此您并不是真正循环到
Vader
的末尾。感谢Bob Gilmore的“开始:步长:结束”条件。我还遇到了for循环在开始时评估大小的问题,而不是整个循环。我将尝试一个嵌套了“for”循环的“while”循环,看看它能给我带来什么。我希望我记得把答案贴回这里Bob Gilamn,请参阅我上面的编辑以获得解决方案。您必须首先计算最终字符串的长度,然后将其用作for的限制loop@user3320919您应该将找到的解决方案作为问题的答案发布,然后接受它,以便阅读问题的人立即意识到您的问题已得到解决。好的,可以!谢谢这是一个很好的起点,更接近我实际需要做的事情。非常感谢。但是,对于奇数长度的字符串,需要
numSpaces=4-mod(长度(str),4)
。我假设传入字符串的长度为奇数或偶数。不过,非常感谢你们,这实际上是我正在努力的下一步,但失败了,你们已经在我不问的情况下为我回答了。当啷,你就是那个男人!
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