我正在努力完成我的一个matlab任务。我想创建10种不同的模型。它们中的每一个都基于相同的原始维数1x100 m_est。然后使用for循环,我从原始模型中选择5个随机值,并希望为每个值添加相同的随机值。该循环重复10次,每次选择不同的值并添加不同的随机数。这是我的代码的一部分:
steps=10;
for s=1:steps
for i=1:1:5
rl(s,i)=m_est(randi(numel(m_est)));
rl_nr(s,i)=find(rl(s,i)==m_est);
a=-1;
b=1;
r(s)=(b-a)*rand(1,1)+a;
end
pert_layers(s,:)=rl(s,:)+r(s);
M=repmat(m_est',s,1);
end
for k=steps
for m=1:1:5
M_pert=M;
M_pert(1:k,rl_nr(k,1:m))=pert_layers(1:k,1:m);
end
end
在矩阵M中,我存储了10个初始模型,并希望将带有rl_nr矩阵的索引的随机数替换为存储在pert_layers矩阵中的随机数。但是,负责将值从pert_layers赋值给rl_nr索引的最后一个循环无法正常工作。
有谁知道如何解决这个问题?
祝你好运
答案 0 :(得分:0)
您的代码使用了很多循环,在这种特殊情况下,它的效率非常低。如果您实际对代码进行矢量化,那就更好了。因此,让我一次一个点地解决您的问题描述并让每个部分编码(如果适用):
我想创建10个不同的模型。它们中的每一个都基于相同的原始维数1x100 m_est。
我将这个解释为你拥有100个元素的数组m_est
,并且使用这个数组,你希望创建10个不同的"模型",其中每个模型是5个元素从m_est
采样。 rl
将m_est
存储这些值,而rl_nr
将存储这些值来源的索引/位置。此外,对于每个模型,您希望向作为此模型一部分的每个元素添加随机值。
然后使用for循环,我从原始模型中选择5个随机值,并希望为每个值添加相同的随机值。
不是通过for
循环执行此操作,而是一次性生成所有随机索引。由于您有10个步骤,并且我们希望每步抽取5个点,因此总共有10*5 = 50
个点。因此,为什么不使用randperm
呢? randperm
正是您正在寻找的,我们可以使用它来生成唯一的随机索引,以便我们最终可以使用它来从m_est
进行采样。 randperm
生成从1
到N
的向量,但会返回这些元素的随机排列。这样,您只能获得从1
到N
枚举一次的数字,我们将确保不会重复。因此,只需使用randperm
生成50个元素,然后将此数组重新整形为大小为10 x 5
的矩阵,其中行数告诉您所需的步数,而列数为每个型号的总点数。因此,做这样的事情:
num_steps = 10;
num_points_model = 5;
ind = randperm(numel(m_est));
ind = ind(1:num_steps*num_points_model);
rl_nr = reshape(ind, num_steps, num_points_model);
rl = m_est(rl_nr);
前两行很简单。我们只是声明您要采取的步骤总数,以及每个模型的总点数。接下来,我们要做的是生成长度为100的随机排列,其中元素从1到100枚举,但它们是随机顺序。您会注意到此随机向量仅使用1到100 完全范围内的值。因为你只想得到50个点,所以只需将这个向量子集化,这样我们就只得到randperm
生成的前50个随机索引。这些随机索引存储在ind
。
接下来,我们只需将ind
重新整形为10 x 5
矩阵即可获得rl_nr
。 rl_nr
将包含将用于从m_est
中选择大小为10 x 5
的条目的索引。最后,rl
将是与rl_nr
大小相同的矩阵,但它将包含从m_est
采样的实际随机值。这些随机值对应于从rl_nr
生成的那些索引。
现在,最后一步是为每个模型添加相同的随机数。您当然可以使用repmat
复制10个元素长的随机列向量,并将它们复制5次,以便我们有5列,然后将此矩阵与rl
....一起添加,如下所示:
a = -1;
b = 1;
r = (b-a)*rand(num_steps, 1) + a;
r = repmat(r, 1, num_points_model);
M_pert = rl + r;
现在M_pert
是您想要的最终结果,我们将每个模型存储在rl
中,并将相同的随机值添加到矩阵中的每个相应模型。但是,如果我可以提出更高效的建议,我建议您使用bsxfun
代替,这将在引擎盖下进行此复制。基本上,上面的代码将替换为:
a = -1;
b = 1;
r = (b-a)*rand(num_steps, 1) + a;
M_pert = bsxfun(@plus, rl, r);
更容易阅读,代码更少。 M_pert
将在每行中包含您的模型,并为每个特定模型添加相同的随机值。
循环重复10次,每次选择不同的值并添加不同的随机数。
已在上述步骤中完成。
我希望你没有发现完全重写你的代码以使它更加向量化,但我认为这是向你展示一些MATLAB具有的更高级功能的绝佳机会。提供以及更有效的方法来生成随机值,而不是一次循环和生成一个值。
希望这会让你开始。祝你好运!