如何从一个大矩阵中随机 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);
假设我有一个大的 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);