从折叠的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];
答
我只是从问题的最终行假设你有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{:});
或者,如果你想在一个行,使用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));
你能解释一下你想要的结果吗?为了避免使用诊断错误,你可以尝试diag(squeeze(v)) –
看看他'squeeze'函数 – Dan
你想创建一个3D对角线,通过'for'循环切割立方体吗? – kkuilla