1

想象一个 2 x 2 x 2 三向数据立方体:

data = [1 2; 3 4];
data(:,:,2) = [5 6; 7 8]

我希望从这个立方体(即 2x2 矩阵)生成行列切片,其中切片的每个元素都是通过随机采样其 3 模光纤获得的(即第 n 模光纤是沿第 n 模运行的矢量/尺寸/方式。这个立方体中有 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])。

4

3 回答 3

0

试试这个解决方案nmode(例如nmode=33 模式):

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 模式光纤”。

如果需要,我很乐意解释每一行。

于 2013-10-24T20:54:24.580 回答
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
于 2013-10-24T20:54:45.067 回答
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
于 2013-10-24T21:24:37.297 回答