Генерация всех заказанных образцов с заменой - PullRequest
0 голосов
/ 07 мая 2019

Я хотел бы создать массив, который содержит все упорядоченные выборки длины k, взятые из набора из n элементов {a_1,...,a_n}, то есть всех k-кортежей (x_1,...,x_k), где каждый x_j может быть любым из a_i (повторение элементов разрешено), общее число которых равно n^k.

Есть ли в Matlab встроенная функция для ее получения?

Я пытался написать код, который итеративно использует функцию datasample, но пока не смог получить желаемого.

Ответы [ 3 ]

1 голос
/ 07 мая 2019

Альтернативный способ получить все кортежи основан на целочисленном представлении k-базы.

Если вы берете k-базовое представление всех целых чисел от 0 до n^k - 1, оно дает вам весь возможный набор k индексов, зная, что эти индексы начинаются с 0.

Теперь реализовать эту идею довольно просто. Вы можете использовать dec2base, если k меньше 10:

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 . Но ИМО вам может и не понадобиться, так как 2 ^ 36 довольно велико.

1 голос
/ 08 мая 2019

Как насчет этого решения, я не знаю, так ли быстро, как у вас, но вы считаете правильным?

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
1 голос
/ 07 мая 2019

То, что вы ищете, это ndgrid: оно генерирует элементы сетки в любом измерении.

В случае, если k зафиксировано на момент кодирования, получить все индексы всех элементов a таким образом:

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

Затем построить матрицу X из вектора A:

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

Если k является параметром, я бы посоветовал взглянуть на код ndgrid и адаптировать его в новой функции, чтобы вывод представлял собой матрицу значений, а не сохранял их в varargout.

...