生成所有带替换的有序样本
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
我想生成一个数组,其中包含取自一组 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,您必须使用自定义代码来检索整数的表示形式,例如
这个解决方案怎么样,我不知道它是否和你的一样快,但你认为正确吗?
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