matlab - 创建对角矩阵(更高维度)

标签 matlab

我有一个 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';

关于matlab - 创建对角矩阵(更高维度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14805355/

相关文章:

regex - MATLAB:在目录中查找具有特定名称的文件?

c# - 将 Kinect 深度保存到二进制文件

image - 在 matlab 中逐像素检查图像的特定 RGB 值

matlab - 什么是 MATLAB 离散化的 OCTAVE 等效项

matlab - `GLIBCXX_3.4.11' 未找到,从链接到 glibc 的 MATLAB 运行系统调用不同于 matlab bin 路径中的内容

matlab - 如何使用 tiledlayout 生成未对齐的子图?

Matlab - 在 x 轴上标记特定值

c# - 加载 Matlab 程序集时流氓等待 40 秒......如何诊断原因?

math - 使用模式在 MATLAB 中创建向量

python - 如何在 Python 中从 Matlab 执行此步骤?