我有一个字符串,它是一个介于0-9之间的数字序列,我想用随机数替换该字符串中的一些数字,但我无法使用{{1} }或rand
因为我一直收到以下错误:
randi
以下是我目前正在尝试更改字符串的某些数字的内容:
Conversion to char from cell is not possible.
Error in work (line 58)
mut(i,7:14) = {mute_by};
% mutate probability 0.2
if (rand < 0.2)
% pick best chromosome to mutate
mut = combo{10};
mute_by = rand([0,9]);
for i = 1:5
mut(i) = {mute_by};
end
end
代表字符串mut
我该怎么做呢?我认为它会相当简单,但我现在已经翻过文档一段时间了,我无法找到解决方案。
答案 0 :(得分:2)
如果要替换字符串中的特定位置,我会做的是生成代表logical
的{{1}}数组,否则生成true
。如何确定这一点是通过生成与字符串大小相同的随机浮动指向点数,并检查它们的值是否为false
。对于字符串中满足此约束的任何位置,请将其替换为另一个随机整数。
执行此操作的最佳方法是将字符串转换为实际数字,以便您可以实际修改其位置,创建我们的< 0.2
数组,然后在这些坐标处用随机整数替换这些值。
这样的事情:
logical
让我们慢慢浏览一下这段代码。 rng
是一个随机种子生成器,我将其设置为rng(123); %// Set seed for reproducibility
mut = '110202132224154246176368198100';
mut_num = double(mut) - 48;
n = numel(mut_num);
vec = rand(1, n) < 0.4;
num_elem = sum(vec);
mut_num(vec) = randi(10,1,num_elem) - 1;
mut_final = char(mut_num + 48);
,这样您就可以重现与随机数生成相同的结果......当然是随机的。我将你的数字声明为123
,然后我有一个很好的技巧,可以将字符串中的每个字符转换为数字数组的单个元素。我通过转换为string
,然后减去48来执行此操作。通过转换为double
,每个元素都会转换为ASCII code,因此double
将为48,{ {1}}将是49,依此类推。因此,我们需要将值减去 48,以便我们可以将其降低到0
的范围。然后,我计算字符串与numel
的长度,然后通过生成我们谈到的1
向量来确定要替换的值。
然后我们计算需要更改的元素数量,然后生成一个完全这个大小的随机整数向量,我们使用这个[0-9]
向量来索引我们最近转换的带有随机整数的字符串(存储为数字数组)。请注意,logical
生成的值从1到您想要的最大值。因为从1开始,我必须生成最多10个,然后减去 1. logical
的输出放入我们的数值数组,然后我们将数值数组转换为带有randi
的字符串。请注意,我们需要添加 48,才能在创建字符串之前将数字转换为ASCII等效值。
我已经将概率改为0.4,以便更好地看到变化。设置为randi
我几乎没有注意到任何变化。 char
将包含已更改的字符串。这是他们的样子:
0.2
mut_final
包含您要更改的字符串中的那些位置,从第2个位置,第3个位置开始等。>> mut
mut =
110202132224154246176368198100
>> vec
vec =
Columns 1 through 13
0 1 1 0 0 0 0 0 0 1 1 0 0
Columns 14 through 26
1 1 0 1 1 0 0 0 0 0 0 0 1
Columns 27 through 30
1 1 1 0
>> mut_final
mut_final =
104202132444143248176368195610
中的相应位置相对于vec
进行更改,而字符串的其余部分未被触及,最终存储在mut
。