2014-06-24 4 views
0

3D 벡터 v이 있습니다. 접힌 3D 행렬에서 대각선 찾기

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

지금 내가 한 단지 :

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

내 3D 벡터에서 3D 행렬을 좀하고 싶습니다 : 루프와

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

, 나는 다음과 같은했다. 당신이 v이 있고 루프없이 B를 얻기 위해 찾고있는 그

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]; 
+2

원하는 결과를 설명해 주시겠습니까? diag를 사용하여 오류를 피하려면 diag (squeeze (v))를 사용하십시오. –

+0

''squeeze' 기능을 살펴보십시오. – Dan

+0

'for' 루프를 사용하여 큐브를 조각내는 3D 대각선을 만들고 싶습니까? – kkuilla

답변

2

난 그냥 질문에 최종 라인에서 가정입니다 : 나는 다음과 같은 벡터가 있다고 가정. 한 줄에 원하는 경우

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

또는, cell2mat를 사용 : -

%// 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 
+0

+1 10k에 축하! 이제 당신은 초능력이 있습니다! –

+0

감사! 나는 지금 세상을 구할거야! ;) – Divakar

2

또 다른 가능성이 동일한 경우, 나는이 당신을 위해 일 것이라고 생각 cat 대신 reshape 대신에

result = reshape(cell2mat(arrayfun(@(k) diag(v(:,:,k)), 1:size(v,3), 'UniformOutput', false)), size(v,1), size(v,1), size(v,3)); 
관련 문제