生成所有需要替换的样品

时间:2019-05-07 10:51:49

标签: matlab sampling

我想生成一个数组,其中包含所有长度为k的有序样本,这些样本取自一组n个元素{a_1,...,a_n},即所有k元组(x_1,...,x_k),其中每个x_j可以是a_i中的任何一个(允许重复元素),并且总数为n^k

Matlab中是否有内置函数来获取它?

我试图编写一个迭代使用datasample函数的代码,但到目前为止我还没有得到想要的结果。

3 个答案:

答案 0 :(得分:1)

您要寻找的是ndgrid:它会生成任意维度的网格元素。

如果k在编码时是固定的,则以这种方式获取所有元素a的所有索引:

[X_1, ..., X_k] = ndgrid(1:n);

然后根据向量X构建矩阵A

X = [A(X_1(:)), ..., A(X_k(:))];

如果k是一个参数,我的建议是看一下ndgrid的代码并将其改编为新函数,以便输出是值的矩阵,而不是将它们存储在{ {1}}。

答案 1 :(得分:1)

获取所有元组的另一种方法是基于k基整数表示。

如果您采用从0到n^k - 1的所有整数的k基表示,则知道这些索引从0开始,它为您提供了所有可能的k个索引集。

现在,实现这个想法非常简单。如果dec2base小于10,则可以使用k

X = A(dec2base(0:(n^k-1), k)-'0'+1));

对于k,在10到36之间,您仍然可以使用dec2base,但是您必须注意字母,因为序号在'9'和'A'之间存在间隙:

X = A(dec2base(0:(n^k-1), k)-'0'+1));
X(X>=17) = X(X>=17)-7;

在36以上,您必须使用定制代码来检索整数表示形式,例如this one。但是IMO可能不需要这个,因为2 ^ 36很大。

答案 2 :(得分:1)

该解决方案怎么样,我不知道它的速度是否与您的一样快,但是您认为正确吗?

function Y = ordsampwithrep(X,K)
%ordsampwithrep Ordered samples with replacement
%   Generates an array Y containing in its rows all ordered samples with  
%   replacement of length K with elements of vector X
X = X(:);
nX = length(X);
Y = zeros(nX^K,K);
Y(1,:) = datasample(X,K)';
k = 2;
while k < nX^K +1
    temprow = datasample(X,K)';
    %checknew = find (temprow == Y(1:k-1,:));
    if not(ismember(temprow,Y(1:k-1,:),'rows'))
        Y(k,:) = temprow;
        k = k+1;
    end
end
end