如何从一个大矩阵中随机 select 多个小且不重叠的矩阵?

How to randomly select multiple small and non-overlapping matrices from a large matrix?

假设我有一个大的 N x M 大小的矩阵 A(例如 1000 x 1000)。在 MATLAB 中从 A 中选择 k 个无放回的随机元素相对简单:

A = rand(1000,1000);         % Generate random data
k = 5;                       % Number of elements to be sampled
sizeA = numel(A);            % Number of elements in A
idx = randperm(sizeA);       % Random permutation
B = A(idx(1:k));             % Random selection of k elements from A

但是,我正在寻找一种方法来扩展上述概念,以便我可以从 A 中随机 select k 个非重叠的 n x m 大小的子矩阵(例如 5 x 5)。什么会是实现这一目标的最方便的方法吗?如果有任何帮助,我将不胜感激!

这可能不是最有效的方法。我敢肯定,如果我(或其他人)多考虑一下,会有更好的方法,但它应该可以帮助您入门。

首先,我将原始 idx(1:k) 重塑为 3D 矩阵 reshape(idx(1:k), 1, 1, k)。然后我将它扩展到所需的长度,用零填充 idx(k, k, 1) = 0; % Extend padding with zeros 最后我使用 2 for 循环来创建正确的索引

for n = 1:k
    for m = 1:k
        idx(m, 1:k, n) = size(A)*(m - 1) + idx(1, 1, n):size(A)*(m - 1) + idx(1, 1, n) + k - 1;
    end
end

构建在你的结尾的完整脚本

A = rand(1000, 1000);
k = 5;
idx = randperm(numel(A));
B = A(idx(1:k));

idx = reshape(idx(1:k), 1, 1, k);
idx(k, k, 1) = 0; % Extend padding with zeros
for n = 1:k
    for m = 1:k
        idx(m, 1:k, n) = size(A)*(m - 1) + idx(1, 1, n):size(A)*(m - 1) + idx(1, 1, n) + k - 1;
    end
end

C = A(idx);