2013-02-11 120 views
2

我有一个n * m矩阵,比如A。我想创建以下m * m * n矩阵,说B创建对角矩阵(更高维)

for j=1:n 
    B(:,:,j)=diag(A(j,:)); 
end 

如何做到这一点,而不必循环?

感谢

+1

'A'是相关的?它不会出现在示例代码中的任何地方......此外,循环的目的是什么?循环内没有'j'(循环下标)?!? – 2013-02-11 03:19:23

+0

另外,与Cross-Validated不同,Stack-Overflow不能识别TeX,所以我已经将你的问题编辑为SO上Matlab问题的一个合理的常见格式。干杯。 – 2013-02-11 03:52:14

+0

我的回复解决了您的问题吗?如果是这样,请通过点击我回复旁边的勾号来标记回答的问题。干杯。 – 2013-02-12 07:02:40

回答

4

更新:我编辑的问题修复错别字的示例代码。

我相当确定您的示例代码包含几个拼写错误,因为目前矩阵A不起作用,您的循环下标j也不起作用。然而,你真正想要问的是:我该如何构建一个3d阵列,其中每个对角线(沿着第三维移动)都是从A开始的一行,而不是循环?

如果这是正确的,那么一个答案如下:

%# A loop-less solution 
Soln2 = zeros(M, M, N); 
Soln2(bsxfun(@plus, (1:M+1:M*M)', (0:M^2:(N-1)*M^2))) = A'; 

基本上所有我所做的是预先分配的溶液3D阵列,然后用bsxfun构建的所有线性指数对角线,沿着第三维移动。然后,我将A的转置(因为您希望行不是列)转换为解决方案数组中的线性索引。

请注意,我在下面为测试目的粘贴了一些示例代码。请确认我对你的基于循环的解决方案的理解是你真正追求的。

%# Set some parameters and create a random matrix A 
N = 3; 
M = 4; 
A = randi(5, N, M); 

%# Your loop based solution 
Soln1 = nan(M, M, N); 
for n = 1:N 
    Soln1(:,:,n) = diag(A(n,:)); 
end 

%# A loop-less solution 
Soln2 = zeros(M, M, N); 
Soln2(bsxfun(@plus, (1:M+1:M*M)', (0:M^2:(N-1)*M^2))) = A'; 
+0

谢谢!这正是我想要的。这太棒了。 – 2013-02-12 13:32:59