假设我有一个大的N x M大小的矩阵A(例如1000 x 1000)。在MATLAB中选择k个随机元素而不用A替换是相对简单的:
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中随机选择k个非重叠的nxm大小的子矩阵(例如5 x 5)。什么是最方便的方法实现这个?我非常感谢任何帮助!
答案 0 :(得分:0)
这可能不是最有效的方法。我敢肯定,如果我(或其他人)更多地认为会有更好的方法,但它应该会帮助你开始。
首先,我将原始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);