从折叠的3D矩阵中找到对角线

问题描述:

我有一个3D矢量v从折叠的3D矩阵中找到对角线

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矢量得到一个三维矩阵。假设我有以下的载体:

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(squeeze(v)) –

+0

看看他'squeeze'函数 – Dan

+0

你想创建一个3D对角线,通过'for'循环切割立方体吗? – kkuilla

我只是从问题的最终行假设你有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 
+0

+1祝贺10k!现在你拥有超级大国! –

+0

谢谢!我现在要拯救世界! ;) – Divakar

另一种可能性:

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

或者,如果你想在一个行,使用cell2matreshape而不是cat

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