Matlab 三向数据立方体的随机抽样

Matlab 三向数据立方体的随机抽样,matlab,random-sample,Matlab,Random Sample,想象一个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 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=[12;34]或[56;7 8])。

对任何
nmode
尝试此解决方案(例如
nmode=3
是3模式):

请注意,这不需要统计工具箱。它也完全适用于任何矩阵尺寸、维数和“N模光纤”


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

如果我理解正确,那么它实际上相当简单。您有四根3模光纤,您希望构造一个2x2矩阵,其中每个元素都是从相应光纤中采样的。
因此,您需要采样4次(每根光纤一次)2个元素中的一个元素(每根光纤有两个元素):

采样后,我们构建切片,为简单起见,我将把3D数据“展平”为2D矩阵

>> fData = reshape( data, [], fiberSize );
>> slice = fData( sub2ind( [h*w fiberSize], 1:(h*w), fIdx ) );
>> slice = reshape( slice, [h w] ); % shape the slice

以下解决方案适用于任何多维数据集大小。不需要工具箱

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

不清楚,什么是三模光纤,第一个切片的取样与第二个切片的取样如何一致?请详细说明。第一个切片的采样与第二个切片的采样一致,因为在每个切片中,元素都是通过对元素所在的“纤维”进行采样而随机生成的(均匀采样)。例如,要生成元素(1,1),您需要从向量[1,5]中采样一个数字。谢谢,我不明白第一个怎么可能是一片。对我来说,[5,2;7,4]是一个对角线切片。我想生成一个2x2矩阵,因为2x2是通过立方体的一行/列切片。2x2矩阵中有4个元素。让我们看第一个元素,(1,1)。其值应来自向量的均匀随机抽样[15]。让我们转到下一个元素(1,2)。它的值应该来自向量[26]。下一个元素是(2,1),它的值应该来自向量[37]。最后一个元素(2,2)需要从向量[4,8]中随机采样一个值。我可以用循环完成所有这些,但我想看看是否有更快/更简单的方法。再次感谢。我不确定您是否需要
N
th模式的通用解决方案,但我认为我的答案提供了这一点,使用沿维度
N
进行均匀采样;更复杂一点,因为采样不是从1:fiberSize开始的。采样来自多维数据集(特定于所述元件的第三模式光纤)的任意值向量。在这个例子中,我使用了1,2,3,4,5,6,7,8来填充立方体,但这只是为了在其中输入值。想象一下里面有任何随机值。我本可以更清楚地说明这一点。谢谢。@val这正是我使用
sub2ind
将采样值1:fiberSize`转换为从
数据中提取的值的原因。请尝试一下我的代码,看看它是否符合您的需要。这里的采样是1:N。采样应该是任意的,从特定于元件的N模光纤进行。(见下文评论)。我认为这里我们特别坚持我的简单示例的结构。谢谢。你说的“这里的抽样是1:N”是什么意思?在每个3模光纤中的所有元件中,采样实际上是随机的。这就是你想要的,不是吗?在您的示例2x2x2中,(1,1)元素的值来自向量[15]的均匀随机采样(我使用您的值作为示例);(1,2)元素来自向量[26],依此类推。你真的试过我的代码吗?
>> fData = reshape( data, [], fiberSize );
>> slice = fData( sub2ind( [h*w fiberSize], 1:(h*w), fIdx ) );
>> slice = reshape( slice, [h w] ); % shape the slice
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