【问题标题】:How to find row `i` of `A= nchoosek(1:m,n)`如何找到`A = nchoosek(1:m,n)`的行`i`
【发布时间】:2015-06-27 00:23:27
【问题描述】:

我想找到A (i,:),其中A= nchoosek(1:m,n),对于给定的imn。 MATLAB 的这个命令非常耗费时间和内存,特别是对于大型 m。所以,我不想构建整个A。我想只构建i 的行A

虽然我的问题似乎与“Combinations from a given set without repetition”重复,但它们是不同的。它只是为A = nchoosek(1:m,2) 提供了可接受的结果,并且不涵盖超过两列。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    我找到了similar question on SO 并在 MATLAB 中实现了建议的解决方案:

    function [result] = kth_combination(k,l,r)
    
    if r == 0
        result = [];
    elseif size(l,2) == r
        result = l;
    else
        i = nchoosek(size(l,2)-1,r-1);
        if k < i+1
            result = [l(1), kth_combination(k, l(2:end), r-1)];
        else
            result = kth_combination(k-i, l(2:end), r);
        end
    end
    end
    

    在 MATLAB File Exchange 上还有另一种解决方案,它不是基于递归:onecomb

    为了比较这 3 个解决方案,我创建了这个基准函数:

    function [time_1,time_2, time_3] = compare_solutions(m,n,i,num_runs)
    time_1 = 0;
    time_2 = 0;
    time_3 = 0;
    
    for run=1:num_runs
    
        tic
        A=nchoosek(1:m,n);
        res_1 = A(i,:);
        time_1 = time_1 + toc;
    
        tic
        res_2 = kth_combination(i,1:m,n);
        time_2 = time_2 + toc;
    
        tic 
        res_3 = onecomb(m,n,i);
        time_3 = time_3 + toc;
    
        if (run==1) && (sum(res_1 ~= res_2) || sum(res_1 ~= res_3))
            error('solutions are NOT identical');
        end
    
    end
    
    time_1 = time_1/num_runs;
    time_2 = time_2/num_runs;
    time_3 = time_3/num_runs;
    
    end
    

    示例运行:

    >>  [time_1,time_2, time_3]  = compare_solutions(20,10,10,10)
    
    time_1 =
    
        1.9676
    
    time_2 =
    
        6.8508e-04
    
    time_3 = 
    
        7.1848e-05
    

    第二种和第三种解决方案比 nchoosek 方法快得多,非递归方法比递归方法快 10 倍。

    【讨论】:

    • 太棒了。此外,我正在寻找一种需要更少内存的解决方案。尽管您提出的代码更快,但它们仍然需要大量内存。大号m很严重。
    • @Meher81:你的m有多大?
    • 可能是 10^8。 n 小于 10。在这种情况下,由于内存限制,构建整个A 是不可能的。所以,我正在考虑另一种方法来找到A 的行i
    • @Meher81:您尝试过链接的onecomb 解决方案吗?它当然可以做你想做的事。
    • 非常感谢。我没有测试过onecomb。这正是我想要的!
    猜你喜欢
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多