【问题标题】:Vectorisation of code for insertion of n x n matrices in a 3D array along the diagonal of a large matrix用于沿大矩阵的对角线在 3D 数组中插入 n x n 矩阵的代码向量化
【发布时间】:2019-10-21 12:18:30
【问题描述】:

my earlier question 一样,我试图沿大矩阵的对角线插入小方阵。但是,这些矩阵现在包含在 3D 数组中,并且具有不同的值。和以前一样,要添加重叠值,并且仅将小矩阵插入到它们完全适合大矩阵的位置。步长维度将始终等于 1。

我已经通过使用 for 循环获得了答案,但我正在尝试将此代码向量化以提高效率。我该怎么做?当前的未矢量化代码如下所示。

function M  = TestDiagonal2()

N           = 10;
n           = 2;
maxRand     = 3;

deepMiniM   = randi(maxRand,n,n,N+1-n);
M           = zeros(N);

for i = 1:N+1-n
    M(i:i+n-1,i:i+n-1) = M(i:i+n-1,i:i+n-1) + deepMiniM(:,:,i);
end

end

所需的结果是一个NxN 矩阵,其中填充了n+1 对角线:

     3     1     0     0     0     0     0     0     0     0
     4     5     3     0     0     0     0     0     0     0
     0     3     3     3     0     0     0     0     0     0
     0     0     1     6     3     0     0     0     0     0
     0     0     0     4     4     4     0     0     0     0
     0     0     0     0     2     3     2     0     0     0
     0     0     0     0     0     2     6     2     0     0
     0     0     0     0     0     0     4     2     2     0
     0     0     0     0     0     0     0     3     3     1
     0     0     0     0     0     0     0     0     3     3

【问题讨论】:

  • 我找不到问题或问题?
  • @Irreducible 代码在其当前状态下未矢量化。我想知道如何矢量化它。
  • 当您添加了一个问题时,您应该告诉我们您尝试这样做的原因/您未能实施它的原因。
  • 我未能实现它,因为我对矩阵操作的理解有限。如果要插入的所需值是标量,我不会有问题。如果不使用 for 循环,似乎没有一种直观的方法可以实现我想要的结果。我正在研究稀疏矩阵,但是这些矩阵非常复杂,我很难理解在这种情况下如何使用它们。

标签: arrays matlab matrix vectorization


【解决方案1】:

这利用implicit expansionsparse 在重合索引处添加值,并使用(:) indexing 在通常的column-major order 中线性化矩阵。

ind1 = repmat((1:n).', n, 1) + (0:N-n); % column indices for the sum
ind2 = repelem((1:n).', n) + (0:N-n); % row indices for the sum
M = full(sparse(ind1(:), ind2(:), deepMiniM(:), N, N)); % sum over those indices

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2023-01-19
    • 2023-04-04
    相关资源
    最近更新 更多