2

我有一个位置矩阵:

positionMatrix = [1 2 3; 1 3 2; 2 1 3];

我想要一个简单的实现(没有 for 循环),它会生成如下数组:

% 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)。

4

4 回答 4

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);

于 2013-11-07T21:29:28.790 回答
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 数组的结果。

于 2013-11-07T23:21:56.900 回答
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) )
于 2013-11-07T16:02:41.527 回答
-1

不确定它是否正是您所需要的,但这里有一些接近要求的东西:

positionMatrix = [1 2 3; 1 3 2; 2 1 3];

myArray = [positionMatrix == 1, positionMatrix == 2, positionMatrix == 3]   

这当然假设您的 positionMatrix 会增加行数,但不会(很多)列数。

于 2013-11-07T16:00:41.517 回答