我有一个位置矩阵:
positionMatrix = [1 2 3; 1 3 2; 2 1 3];
我想要一个简单的实现(不用于循环),它将生成如下数组:
% there are 3 lines in positionMatrix, so it should generates 3 arrays of ones
array 1 should be [1 0 0; 0 1 0; 0 0 1] %from positionMatrix 1 2 3
array 2 should be [1 0 0; 0 0 1; 0 1 0] %from positionMatrix 1 3 2
array 3 should be [0 1 0; 1 0 0; 0 0 1] %from positionMatrix 2 1 3
positionMatrix可以是M x N(M不等于N)。
答案 0 :(得分:2)
将输出生成为单个3D数组
[M N] = size( positionMatrix );
mx = max(positionMatrix(:)); % max column index
out = zeros( [N mx M] );
out( sub2ind( size(out), ...
repmat( 1:N, [M 1] ),...
positionMatrix, ...
repmat( (1:M)', [1 N] ) ) ) = 1;
out(:,:,1) =
1 0 0
0 1 0
0 0 1
out(:,:,2) =
1 0 0
0 0 1
0 1 0
out(:,:,3) =
0 1 0
1 0 0
0 0 1
如果您希望每个输出矩阵作为不同的单元格,则可以使用mat2cell
>> mat2cell( out, N, mx, ones(1,M) )
答案 1 :(得分:2)
我再次使用accumarray
。实际上,如果您认为输出中的位置分配如下,那么这个accumarray
非常直观,
positionMatrix
。positionMatrix
中的列。positionMatrix
中的行。如果我们调用输出矩阵map
,这就是如何应用accumarray
:
[slices,rows] = ndgrid(1:size(positionMatrix,1),1:size(positionMatrix,2));
map = accumarray([rows(:) positionMatrix(:) slices(:)],ones(1,numel(rows)))
map(:,:,1) =
1 0 0
0 1 0
0 0 1
map(:,:,2) =
1 0 0
0 0 1
0 1 0
map(:,:,3) =
0 1 0
1 0 0
0 0 1
如果需要,您可以将三个切片与map = reshape(map,size(map,1),[],1);
并排放置。
答案 2 :(得分:2)
也可以使用ndgrid
:
positionMatrixTr = positionMatrix.';
[M N] = size(positionMatrixTr);
L = max(positionMatrixTr(:));
[jj kk] = ndgrid(1:M,1:N);
array = zeros(M,L,N);
array(sub2ind([M L N],jj(:),positionMatrixTr(:),kk(:))) = 1;
正如其他答案所示,这会将结果显示在3D数组中。
答案 3 :(得分:-1)
不确定它是否正是您所需要的,但这里有一些接近要求的东西:
positionMatrix = [1 2 3; 1 3 2; 2 1 3];
myArray = [positionMatrix == 1, positionMatrix == 2, positionMatrix == 3]
这当然假设您的positionMatrix将以行数增长,但不会增加(大量)列数。