矩阵行块的矢量化混洗
Vectorize shuffle for blocks of matrix rows
我有一个名为 mat_orig
的简单 5x15
矩阵。我想将这个矩阵分成不重叠的块,每个块的长度为 3。这相当于将三个不重叠的行放入一个块中(即有 5 个大小为 3x5
的块)。
然后我想打乱 mat_orig
并生成一个新矩阵。我正在使用 randi
随机抽取五个方块。
我使用下面的代码成功完成了我的任务。但是,我想知道我是否可以摆脱 for 循环?我可以应用矢量化吗?
mat_orig = reshape(1:75, 5, 15)';
block_length = 3;
num_blocks = size(mat_orig, 1) / block_length;
rand_blocks = randi(num_blocks, num_blocks, 1);
mat_shuffled = nan(size(mat_orig));
for r = 0 : num_blocks - 1
start_row_orig = r * block_length + 1;
end_row_orig = r * block_length + block_length;
start_row_random_blocks = ...
rand_blocks(r + 1) * block_length - block_length + 1;
end_row_random_blocks = ...
rand_blocks(r + 1) * block_length;
mat_shuffled(start_row_orig:end_row_orig, :) = ...
mat_orig(start_row_random_blocks:end_row_random_blocks, :);
end
您可以通过隐式扩展来创建块的索引,详情请参阅代码注释。
mat_orig = reshape(1:75, 5, 15)';
block_length = 3;
num_blocks = size(mat_orig,1) / block_length;
% Get the shuffle order (can repeat blocks)
shuffIdx = randi( num_blocks, num_blocks, 1 ).';
% Expand these indices to fill the blocks
% This uses implicit expansion to create a matrix, and
% will only work in R2016b or newer.
% For older versions, use 'bsxfun'
shuffIdx = block_length * shuffIdx - (block_length-1:-1:0).';
% Create the shuffled output
mat_shuffled = mat_orig( shuffIdx(:), : );
我有一个名为 mat_orig
的简单 5x15
矩阵。我想将这个矩阵分成不重叠的块,每个块的长度为 3。这相当于将三个不重叠的行放入一个块中(即有 5 个大小为 3x5
的块)。
然后我想打乱 mat_orig
并生成一个新矩阵。我正在使用 randi
随机抽取五个方块。
我使用下面的代码成功完成了我的任务。但是,我想知道我是否可以摆脱 for 循环?我可以应用矢量化吗?
mat_orig = reshape(1:75, 5, 15)';
block_length = 3;
num_blocks = size(mat_orig, 1) / block_length;
rand_blocks = randi(num_blocks, num_blocks, 1);
mat_shuffled = nan(size(mat_orig));
for r = 0 : num_blocks - 1
start_row_orig = r * block_length + 1;
end_row_orig = r * block_length + block_length;
start_row_random_blocks = ...
rand_blocks(r + 1) * block_length - block_length + 1;
end_row_random_blocks = ...
rand_blocks(r + 1) * block_length;
mat_shuffled(start_row_orig:end_row_orig, :) = ...
mat_orig(start_row_random_blocks:end_row_random_blocks, :);
end
您可以通过隐式扩展来创建块的索引,详情请参阅代码注释。
mat_orig = reshape(1:75, 5, 15)';
block_length = 3;
num_blocks = size(mat_orig,1) / block_length;
% Get the shuffle order (can repeat blocks)
shuffIdx = randi( num_blocks, num_blocks, 1 ).';
% Expand these indices to fill the blocks
% This uses implicit expansion to create a matrix, and
% will only work in R2016b or newer.
% For older versions, use 'bsxfun'
shuffIdx = block_length * shuffIdx - (block_length-1:-1:0).';
% Create the shuffled output
mat_shuffled = mat_orig( shuffIdx(:), : );