我有一个n
* m
矩阵,比如A
。我想创建以下m
* m
* n
矩阵,说B
创建对角矩阵(更高维)
for j=1:n
B(:,:,j)=diag(A(j,:));
end
如何做到这一点,而不必循环?
感谢
我有一个n
* m
矩阵,比如A
。我想创建以下m
* m
* n
矩阵,说B
创建对角矩阵(更高维)
for j=1:n
B(:,:,j)=diag(A(j,:));
end
如何做到这一点,而不必循环?
感谢
更新:我编辑的问题修复错别字的示例代码。
我相当确定您的示例代码包含几个拼写错误,因为目前矩阵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';
谢谢!这正是我想要的。这太棒了。 – 2013-02-12 13:32:59
'A'是相关的?它不会出现在示例代码中的任何地方......此外,循环的目的是什么?循环内没有'j'(循环下标)?!? – 2013-02-11 03:19:23
另外,与Cross-Validated不同,Stack-Overflow不能识别TeX,所以我已经将你的问题编辑为SO上Matlab问题的一个合理的常见格式。干杯。 – 2013-02-11 03:52:14
我的回复解决了您的问题吗?如果是这样,请通过点击我回复旁边的勾号来标记回答的问题。干杯。 – 2013-02-12 07:02:40