在MATLAB中使用两个具有分类值的映射向量将2D矩阵转换为3D

|| 可能已经有人问过类似的问题,但我找不到它。今天我出了点问题,我无法找到一种常见问题的好的解决方案。 我有M x N个双精度矩阵和两个N x 1个带有分类值的向量(字符串的单元格数组)。第一个向量包含K个唯一值,而第二个-L个唯一值,例如K * L> =N。 我想将原始矩阵转换为3D矩阵M x K xL。因此,为了保持第一维,第二维将对应于第一向量中的唯一值,而第三维-将对应于第二向量中的唯一值。 让我们考虑向量没有排序。确保两个向量中没有对应元素的重复组合。缺少组合的矩阵值可以为0s。 我可以将分类向量转换为带有ѭ0numbers的数字,可以将其视为列号和页码。但是如何将它们应用于原始矩阵? 编辑: 这是一些随机数据:
A = reshape(1:24,4,6);
v1 = {\'s1\',\'s1\',\'s2\',\'s2\',\'s3\',\'s3\'}\';
v2 = {\'t1\',\'t2\',\'t1\',\'t2\',\'t1\',\'t2\'}\';
idx = randperm(6); %# just to randomize
v1 = v1(idx);
v2 = v2(idx);
[M, N] = size(z); %# M=4, N=6
K = numel(unique(v1)); %# K=3
L = numel(unique(v2)); %# L=2
我需要将矩阵A重塑为4x3x2,以使第1页的第1列对应于组合s1_t1,第2页的第2列对应于s2_t2,依此类推。在此示例中,K * L等于N,因此所有位置都具有数据,但是这不是一般情况。     
已邀请:
        您可以为此使用
accumarray
。请注意,
grp2idx
会产生一些出乎意料的结果,因为它从找到的第一个唯一元素开始编号,而不是根据
v1
v2
的排序值进行编号。如果您不关心订单,可以使用例如
idx2=grp2idx(v1)
idx1 = ndgrid(1:M,1:N); %# rows
[~,idx2]=ismember(v1,unique(v1)); 
idx2 = repmat(idx2\',M,1); 
[~,idx3]=ismember(v2,unique(v2));
idx3 = repmat(idx3\',M,1);

out = accumarray([idx1(:),idx2(:),idx3(:)],A(:),[M,K,L],@(x)x,0);
    

要回复问题请先登录注册