【问题标题】:(MATLAB) On drawing elements randomly from vectors and rows randomly from matrices without replacement in for loops(MATLAB)关于从向量中随机绘制元素并从矩阵中随机绘制行而不在 for 循环中替换
【发布时间】:2015-11-17 09:14:25
【问题描述】:

所以,我正在为我在 MATLAB 中构建的实验编写代码的两个相关问题。首先,我有一个 20 行的列向量,称为 block1(在 20 个插槽中的每个插槽中都有一个数字)。

我想从向量中随机抽取一个数字而不进行替换,然后重复此操作,直到向量中没有数字(总共 20 次)。我在 for 循环中有以下行(设置为运行 20 次迭代),它从向量中提取随机数并将其设置为等于变量 rand_num:

rand_num = randsample(block1,1,false)

抽随机数就好了,但问题是没有替换部分的抽奖是行不通的。最初我认为这是因为向量在 for 循环的每次迭代开始时被重置。为了确保,我调试并发现即使在第一次迭代完成之前(以及在绘制随机数之后)停止 for 循环,向量中仍然有 20 个数字(应该有 19 个)。关于如何解决此问题的任何想法?

第二个问题如下。对于同一个实验,我有一个名为pick_matrix 的 20 x 6 矩阵。在与上述相同的 for 循环的每次迭代中,我想从矩阵中随机选择一行(包括该行中的每个元素;因此每行总共 6 个元素)而不进行替换,并将该行分配给变量random_row

我想出了随机选择一行并将其分配给 random_row 的代码,但我遇到了与上一个问题相同的问题:没有替换的部分不起作用。

【问题讨论】:

  • 不提供代码是无法回答的。一般来说,我认为你不需要 for 循环(你很少在 Matlab 中这样做)。看看randperm
  • randperm 运行良好,谢谢。

标签: matlab for-loop matrix random vector


【解决方案1】:

randsample 工作正常,完全符合预期。您只需要在循环之前调用它一次,而不是在循环中调用 20 次。仔细阅读帮助 - randsample 不会更改输入变量 block1 的任何内容。一般来说(忽略全局变量等),输入变量不会被 Matlab 函数更改,即使它们在函数内被更改,除非它们随后被显式输出。

例如考虑一下:

function y = myfunc(x);

    x = x*2;
    y = x*3;
    disp(x)

end

在函数内,x 加倍。假设我的工作区中有一个变量 x,值为 10。如果我调用 y = myfunc(2),我会看到“4”被替换 - 并且 y 将输出为 12,而不是 6。但是,x 在我的基本工作区永远不会改变,这正是预期的行为。

如果我想更改x,我必须将其显式设置为函数的输出并且故意以覆盖我的变量x的方式调用该函数,例如[x y] = myfunc(2);

按照 cmets 中的建议,如果您要取每个数字,则可以改用 randperm,但更通用的示例是使用 randsample 从 20 中随机选择 10:

% sampling without replacement is default
rand_nums = randsample(block1, 10); 
rand_ind = randperm(20,10); % 10 numbers from 1:20

for n = 1:10

    rand_num = rand_nums(n);
    rand_row = pick_matrix(rand_ind(n),:);
    % whatever you need to do with these things goes here

end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2012-07-14
    • 2013-04-08
    相关资源
    最近更新 更多