Нахождение диагонали из свернутой 3D-матрицы

У меня есть 3D-векторы v.

A = rand(2, 2, 2);
v = sum(A, 2);

Теперь я просто сделал:

B = diag(v);
Error using diag
First input must be 2D. 

С циклом я сделал следующее:

for i = 1:2
   B{i} = diag(v(:, :, i));
end

Я хотел бы получить 3D-матрицы из моих 3D-векторов. Предположим, у меня есть следующий вектор:

v(:, :, 1)=[1 2 3]';
v(:, :, 2)=[1 2 4]';
%I would like to get, using some command and without loop (if possible), a 3D matrix B
B(:, :, 1)=[1 0 0; 
            0 2 0; 
            0 0 3];
B(:, :, 2)=[1 0 0;
            0 2 0;  
            0 0 4];

person Ribz    schedule 24.06.2014    source источник
comment
Не могли бы вы объяснить желаемый результат? Чтобы избежать ошибки при использовании diag, вы можете попробовать diag(squeeze(v))   -  person Joe Serrano    schedule 24.06.2014
comment
Посмотрите на функцию squeeze   -  person Dan    schedule 24.06.2014
comment
Вы хотите создать 3D-диагональ, которая пересекает куб без петли for?   -  person kkuilla    schedule 24.06.2014
comment
@kkuilla да, верно.   -  person Ribz    schedule 24.06.2014


Ответы (2)


Я просто предполагаю из ваших последних строк в вопросе, что у вас есть v и вы хотите получить B без циклов. Для того же, я думаю, это сработает для вас -

%// Input
v(:, :, 1)=[1 2 3]';
v(:, :, 2)=[1 2 4]';

[M,~,P] = size(v)
B = zeros(size(v,1),size(v,1),size(v,3));
B(bsxfun(@plus,[1:M+1:M*M]',[0:P-1]*M*M)) = v %//'

Выход -

B(:,:,1) =
     1     0     0
     0     2     0
     0     0     3
B(:,:,2) =
     1     0     0
     0     2     0
     0     0     4
person Divakar    schedule 24.06.2014
comment
Спасибо! Я сейчас спасу мир! ;) - person Divakar; 25.06.2014

Другая возможность:

result = arrayfun(@(k) diag(v(:,:,k)), 1:size(v,3), 'UniformOutput', false);
result = cat(3, result{:});

Или, если вы хотите, чтобы это было в одной строке, используйте cell2mat и reshape вместо cat:

result = reshape(cell2mat(arrayfun(@(k) diag(v(:,:,k)), 1:size(v,3), 'UniformOutput', false)), size(v,1), size(v,1), size(v,3));
person Luis Mendo    schedule 24.06.2014