生成所有带替换的有序样本

Generating all ordered samples with replacement

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

Matlab有内置函数可以获取吗?

我试图编写一个迭代使用 datasample 函数的代码,但到目前为止我无法得到想要的东西。

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

如果k在编码的时候是固定的,那么得到所有元素a的所有索引这样:

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

然后从向量 A:

构建矩阵 X
X = [A(X_1(:)), ..., A(X_k(:))];

如果 k 是参数,我的建议是查看 ndgrid 的代码并在新函数中对其进行调整,以便输出是值矩阵而不是存储它们在 varargout.

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

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

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

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

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

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

超过 36,您必须使用自定义代码来检索整数的表示形式,例如 。但是 IMO 你可能不需要这个,因为 2^36 是相当大的。

这个解决方案怎么样,我不知道它是否和你的一样快,但你认为正确吗?

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