更改矩阵之间给定索引的数字

时间:2014-12-09 17:30:01

标签: matlab

我正在努力完成我的一个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索引的最后一个循环无法正常工作。

有谁知道如何解决这个问题?

祝你好运

1 个答案:

答案 0 :(得分:0)

您的代码使用了很多循环,在这种特殊情况下,它的效率非常低。如果您实际对代码进行矢量化,那就更好了。因此,让我一次一个点地解决您的问题描述并让每个部分编码(如果适用):

  

我想创建10个不同的模型。它们中的每一个都基于相同的原始维数1x100 m_est。

我将这个解释为你拥有100个元素的数组m_est,并且使用这个数组,你希望创建10个不同的"模型",其中每个模型是5个元素从m_est采样。 rlm_est存储这些值,而rl_nr将存储这些值来源的索引/位置。此外,对于每个模型,您希望向作为此模型一部分的每个元素添加随机值。

  

然后使用for循环,我从原始模型中选择5个随机值,并希望为每个值添加相同的随机值。

不是通过for循环执行此操作,而是一次性生成所有随机索引。由于您有10个步骤,并且我们希望每步抽取5个点,因此总共有10*5 = 50个点。因此,为什么不使用randperm呢? randperm正是您正在寻找的,我们可以使用它来生成唯一的随机索引,以便我们最终可以使用它来从m_est进行采样。 randperm生成从1N的向量,但会返回这些元素的随机排列。这样,您只能获得从1N枚举一次的数字,我们将确保不会重复。因此,只需使用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_nrrl_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具有的更高级功能的绝佳机会。提供以及更有效的方法来生成随机值,而不是一次循环和生成一个值。

希望这会让你开始。祝你好运!