首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MATLAB 一維數組分段隨機採樣:按固定間隔提取區間內隨機 20 個值的向量化實現

     編輯:程式設計綜合問答

問題建模

原數組 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⭐⭐⭐⭐

擴展應用場景

  • 時間序列分桶採樣
  • 圖像分塊隨機選取像素
  • 大數據集分層抽樣
  • 信號處理分段特徵提取

注意事項

  1. randperm 要求 k <= n,否則報錯
  2. 預分配輸出數組 zeros 顯著提升性能
  3. 隨機數種子控制:rng(seed) 保證可復現
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved