我想生成一个数组,其中包含所有长度为k的有序样本,这些样本取自一组n个元素{a_1,...,a_n}
,即所有k元组(x_1,...,x_k)
,其中每个x_j
可以是a_i
中的任何一个(允许重复元素),并且总数为n^k
。
Matlab中是否有内置函数来获取它?
我试图编写一个迭代使用datasample
函数的代码,但到目前为止我还没有得到想要的结果。
答案 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