2013-11-07 3 views
2

У меня есть матрица положение:Создать массив единиц в указанном порядке

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

Должны ли они быть 3 массива, или они также могут быть 1 большой массив? –

+0

'for' петли довольно просты, если вы спросите меня. – horchler

+0

@DennisJaheruddin Ну, после этого 3 массива будут умножаться на другой массив. Поэтому я получаю 3 разных результата. Я полагаю, они могут быть в одном большом массиве ... –

ответ

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

Он отлично работает. –

+0

Я попробую ваше решение. –

+0

Не 'mx = N -1'? –

-1

Не уверен, что это именно то, что вам нужно, но вот что-то, что приближается к требованиям:

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

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

Это, конечно, предполагает, что ваш positionMatrix будет расти в количестве строк, но нет (много) в количестве столбцов.

+0

Обратите внимание, что это просто самое простое решение. Он может быть расширен для произвольного количества столбцов с такими вещами, как 'repmat' или' kron'. но я не уверен, будет ли он по-прежнему квалифицироваться как простой. –

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

+0

+1 Есть ли что-нибудь, что нельзя сделать с помощью 'tankarray'? :-) –

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-массиве.