从矩阵中随机选择元素,必须包括之前未选择的元素

时间:2017-06-13 07:01:52

标签: matlab matrix vector random

我有一个时变16*1向量,我想在每个时刻从这个向量中随机选择11个元素。但我希望连续时间之间挑选的元素尽可能不同。例如,如果在时间1:11选择了元素t,我希望元素12:16绝对是时刻t+1中所选元素之一。从t+1t+2应该满足相同的条件,依此类推。

这是我已经尝试过的:

N=16;
M=11;
for t=1:96
    x(:,:,t)=randn(N,1)
end

for t=1:96
    E = eye(M,N);
    Phi(:,:,t)=E(randperm(M),randperm(N));
end

for t=1:96
    y(:,:,t)=Phi(:,:,t)*x(:,:,t);
end

并在我的Phi(:,:,t)向量时间16*1倍增t(x(t))

但这完全是随机的,并没有考虑两个连续时刻之间的各种选择。事实上,每个x(:,:,t)包含16个传感器节点的读数,我希望所有这些传感器节点在两个时间点之间生成测量y(:,:,t)时发挥作用。 我必须在时间段t:t+1内获得所有16个传感器节点的读数。我不希望在[t:t+1]中遗漏一个传感器读数。我感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

所以你有N=16个元素,并且每次都选择M=11。这意味着在时间N-M和时间t+1,最多只有t个元素不同,并且您将重叠M-(N-M)

M = 11;
N = 16;
idx = 1:N;          % All numbers to choose from
r = randperm(N, M); % Choose 11 random elements from 16 to start
for t = 1:10
    previouslypicked = ismember(idx,r); % Get elements which aren't in previous choice
    rnew = idx(~previouslypicked);      % Start off with elements not previously picked
    r = [rnew, r(randperm(M, M-(N-M)))] % Append random selection of other elements
end

示例:

% Initial vector from r = randperm(N,M)
r = [2     7     8    11    14     9    15    16     1    13     5];
% After one iteration
r = [3     4     6    11    12     2     8    10    13     9    16];

第一个向量缺失[3,4,6,10,12],它们都包含在第二个向量中。第二个向量中的其他元素是随机的,与手动选择的元素不同,因为它们先前不存在。

因此,所有元素都会在任意两次连续迭代t:t+1之间进行计算。

当然,这可以在一行中完成。为清楚起见,我只分析了一些内容,此示例还包括生成Phi

M = 11; N = 16; T = 96; idx = 1:N; 
r = randperm(N, M); 
Phi = zeros(M, N, T);
for t = 1:T
    r = [idx(~ismember(idx,r)), r(randperm(M, M-(N-M)))];
    % Get Phi, which is M*N*T with 1 in each row & at most 1 in each column, for each t
    E = zeros(M,N);                 % Set up zeros matrix
    E(sub2ind([M,N], 1:M, r)) = 1;  % Set desired elements to 1, satisfying Phi format
    Phi(:,:,t) = E;                 % Assign to layer of Phi
end

同样,这可以在一行中完成,无需E

M = 11; N = 16; T = 96; idx = 1:N; 
r = randperm(N, M); 
Phi = zeros(M, N, T);
for t = 1:T
    r = [idx(~ismember(idx,r)), r(randperm(M, M-(N-M)))];
    Phi(sub2ind([M,N,T], 1:M, r, ones(1,M)*t)) = 1;
end