想象一个2 x 2 x 2的三向数据立方体:
data = [1 2; 3 4];
data(:,:,2) = [5 6; 7 8]
我希望从这个立方体生成一个行列切片(即一个2x2矩阵),其中切片的每个元素是通过随机采样其3模光纤获得的(即第n模光纤是沿着该模块运行的向量) nth mode / dimension / way。这个立方体中有4个3模光纤,其中一个是f1 = [1 5],另一个是f2 = [2 6],依此类推)。例如,一个切片可能会变成:
slice = [5 2; 3 4]
不同的采样可能导致切片:
slice = [1 2; 7 8]
有快速的方法吗?
我尝试使用slice = datasample(data,1,3),但是这个函数从多维数据集中随机选取一个行列切片(即,slice = [1 2; 3 4]或[5 6; 7 8] )。
答案 0 :(得分:0)
针对任何nmode
尝试此解决方案(例如nmode=3
是3模式):
data = cat(3,[1 2; 3 4],[5 6; 7 8]);
nmode = 3;
Dn = size(data,nmode);
modeSampleInds = randi(Dn,1,numel(data)/Dn); % here is the random sample
dp = reshape(permute(data,[nmode setdiff(1:ndims(data),nmode)]), Dn, []);
outSize = size(data); outSize(nmode)=1;
slice = reshape(dp(sub2ind(size(dp),modeSampleInds,1:size(dp,2))),outSize)
请注意,这不需要统计工具箱。对于任何矩阵大小,维数和“N模光纤”,它也是完全推广的。
如果需要,我很乐意解释每一行。
答案 1 :(得分:0)
如果我理解正确,那么实际上它很简单。您有四个3模光纤,并且您希望构建一个2x2矩阵,其中每个元素都是从相应的光纤中采样的 因此,您需要对2个中的一个元素(每个光纤有两个元素)进行4次采样(每个光纤一个):
>> [h w fiberSize] = size(data); % make the solution more general
>> fIdx = randsample( fiberSize, h*w ); % sample with replacements
采样后我们构建切片,为简单起见,我将“3D”数据“压平”为2D矩阵
>> fData = reshape( data, [], fiberSize );
>> slice = fData( sub2ind( [h*w fiberSize], 1:(h*w), fIdx ) );
>> slice = reshape( slice, [h w] ); % shape the slice
答案 2 :(得分:0)
以下解决方案适用于任何多维数据集大小。无需工具箱。
N = size(data,1); %//length of side of cube
r = randi(N,1,N^2)-1; %//this is the random sampling
data_permuted = permute(data,[3 1 2]); %//permute so that sampling is along first dim
slice = data_permuted((1:N:N^3)+r); %//sample using linear indexing
slice = reshape(slice.',N,N); %//reshape into a matrix