【问题标题】:MATLAB 2D randperm with no for loop没有 for 循环的 MATLAB 2D randperm
【发布时间】:2015-01-12 23:46:32
【问题描述】:

我想制作一个随机排列的二维数组,其中每一行可能包含一个在前一行中生成的数字。但是同一行不能有相同的数字。

是否有没有for循环的情况下执行以下代码?

a = (1:100);
b = zeros(size(a,2), 4);
for i = 1:size(a, 2)
     r = randperm(size(a, 2),4);
     b(i,:) = r;
end

【问题讨论】:

  • 您是否考虑过实施递归解决方案?这是作业题吗?
  • 不,这不是家庭作业。以递归方式执行此操作会提高效率吗?
  • 不确定,根据我的经验,我发现在 Matlab 中设计良好的循环通常更快。所以解决方案可能涉及一个循环,但您也愿意接受其他建议?
  • 是的,还有什么其他建议?
  • 对我来说似乎很高效,为什么需要更高效?

标签: matlab random permutation


【解决方案1】:

如果您没有内存限制,可以使用以下方法(当实际只需要“4”列时,它会生成一个中间“100”列矩阵):

  1. 生成完整排列。这可以通过sort 的第一个输出轻松完成(模仿randperm 在旧Matlab 版本中的编码方式)。
  2. 修剪到所需的列数。

代码:

a = 1:100;
n = 4;
[~, result] = sort(rand(numel(a)),2);   %// step 1
result = result(:, 1:n);                %// step 2

【讨论】:

    【解决方案2】:

    会产生类似结果的一种不太有效的方法(主要是因为排序)是:

    [dummy, idx] = sort(rand(100, 4));
    b = idx';
    

    正如所指出的,这会生成一个数组b,其中包含非重复元素的行,但它有 4 行和 100 列,而不是相反。请改用 Luis 的解决方案。

    【讨论】:

    • 但这并不能防止同一行出现重复数字
    • 我认为idxs 列没有重复的数字。不是这样吗?
    • 尝试以下几次:[dummy, idx] = sort(rand(10, 4))(10而不是100增加重复数字的概率)
    • 我不是在谈论行,而是在谈论列。列不能有重复的数字,因为它描述了原始列的排列以产生其排序版本。这就是为什么b 被分配idx 的转置。
    • 多次尝试[dummy, idx] = sort(rand(10, 4)); b = idx',您会在同一列中找到两次相同的数字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多