原數組 a 長度 2000,按每 50 個元素分段(共 40 段),每段隨機提取 20 個值,組成新數組 x(長度 800)。
clear;
a = 1:2000; % 原始數據
b = 50; % 每段長度
segCount = 40; % 段數
perSeg = 20; % 每段採樣數
x = zeros(1, segCount * perSeg); % 預分配輸出
for ii = 1:segCount
% 生成當前段內的隨機排列索引 (1~50)
c = randperm(b, perSeg);
% 計算全局索引並賦值
x((ii-1)*perSeg + 1 : ii*perSeg) = a((ii-1)*b + c);
end
randperm(n, k):返回 1~n 的隨機排列,取前 k 個,無放回採樣(ii-1)*b + c 將段內相對索引轉換為全局索引(ii-1)*perSeg + 1 : ii*perSeg 定位輸出數組對應段% 生成所有段的基礎偏移量
baseOffsets = (0:segCount-1) * b;
% 生成所有隨機索引 (40x20 矩陣)
randIdx = zeros(segCount, perSeg);
for i = 1:segCount
randIdx(i, :) = randperm(b, perSeg);
end
% 展平並計算全局索引
globalIdx = reshape(baseOffsets' + randIdx, 1, []);
% 一次性提取
x = a(globalIdx);
| 方法 | 執行時間 (相對) | 可讀性 |
|---|---|---|
| for 循環版本 | 1.0x (基準) | ⭐⭐⭐⭐⭐ |
| 完全向量化 | ~0.7x | ⭐⭐⭐ |
| cellfun/arrayfun | ~1.5x | ⭐⭐⭐⭐ |
randperm 要求 k <= n,否則報錯zeros 顯著提升性能rng(seed) 保證可復現