【问题标题】:Randomly choose elements from a matrix, must include those not chosen before从矩阵中随机选择元素,必须包括之前未选择的元素
【发布时间】:2025-04-27 07:50:02
【问题描述】:

我有一个随时间变化的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] 中丢失一个传感器读数。感谢您的帮助。

【问题讨论】:

  • “最”、“肯定”非常不科学。您模糊地描述的是某种规则可以选择下一个,您能否更清楚地了解哪些约束?另外,请注意,一旦设置了约束,您就会失去随机性。如果随机性有时很重要,请注意你正在失去它
  • 关于随机性,它会在其他地方显示出来(我希望),我并没有完全失去它。我只想要多样性。更清楚地说,我在上面定义了一个矩阵 Phi(:,:,t),它是 M*N,每行只有一个 1,每列最多有一个 1。我使用这个矩阵从我的16*1 向量x(t) 中随机选择11 元素。下次(t+1) 这个随机矩阵 Phi 发生变化并从x(t+1) 中随机选择11 元素。
  • 我想你可能有XY problem. 你能告诉我们你想做什么,而不是你在尝试解决它时遇到的问题吗?另请注意,如果您失去随机性,它就不会“出现”。你把它弄丢了。

标签: matlab matrix vector random


【解决方案1】:

所以你有N=16 元素,并且每次都选择M=11。这意味着在时间t+1 和时间t 最多可以有不同的N-M 元素,并且您将有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   

【讨论】:

    最近更新 更多