【问题标题】:Vectorisation of code for insertion of 2x2 matrix along the diagonal of a large matrix用于沿大矩阵对角线插入 2x2 矩阵的代码向量化
【发布时间】:2019-10-21 10:39:55
【问题描述】:

我正在尝试沿大矩阵(例如 10x10)的对角线插入小矩阵(2x2)的元素。添加重叠值,小矩阵仅插入到可以完全放入大矩阵的位置。

我已经使用 for 循环实现了这一点,但我很好奇该过程是否可以向量化。

function M = TestDiagonal()

N     = 10;
miniM = [1, -1; -1, 1];
M     = zeros(N);

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

end

给出所需的矩阵

 1    -1     0     0     0     0     0     0     0     0
-1     2    -1     0     0     0     0     0     0     0
 0    -1     2    -1     0     0     0     0     0     0
 0     0    -1     2    -1     0     0     0     0     0
 0     0     0    -1     2    -1     0     0     0     0
 0     0     0     0    -1     2    -1     0     0     0
 0     0     0     0     0    -1     2    -1     0     0
 0     0     0     0     0     0    -1     2    -1     0
 0     0     0     0     0     0     0    -1     2    -1
 0     0     0     0     0     0     0     0    -1     1

在一般情况下,输入总是正方形的,但可以是任意大小。步长维度将始终等于 1。

【问题讨论】:

  • 输入总是2×2吗?它可以更大,还是非方形(m×n)?在这种情况下,期望的步骤是什么?每个维度总是 1?还是m-1n-1
  • 输入总是正方形的,但可以是任意大小。步长维度将始终等于 1。
  • 感谢您的澄清。然后,您可以使用我答案的最后一部分,step = [1 1]R = N-size(miniM,1)+1。下次请尝试在问题文本中从头开始指定所有内容,并避免使用不能反映一般情况的示例

标签: arrays matlab matrix vectorization


【解决方案1】:

只需使用 2D 卷积(请参阅 conv2)。

2×2 案例,沿每个维度执行步骤 1

M = conv2(eye(N-1), miniM);

m×m案例,每个维度的第1步

M = conv2(eye(N-size(miniM-1)+1), miniM);

m×n case,沿每个维度的任意步骤

在这种情况下,需要定义步骤:

step = [2 1]; % desired step along each dimension

定义所需的重复次数R 比定义最终大小 (N) 更有意义,因为完全重复 miniM 可能无法实现后者:

R = 4; % desired number of repetitions

然后:

M = conv2(full(sparse(1:step(1):step(1)*R, 1:step(2):step(2)*R, 1)), miniM);

例子:

>> miniM = [10 20 30; 40 50 60];
>> R = 4;
>> step = [1 2];
>> M = conv2(full(sparse(1:step(1):step(1)*R, 1:step(2):step(2)*R, 1)), miniM)
M =
    10    20    30     0     0     0     0     0     0
    40    50    70    20    30     0     0     0     0
     0     0    40    50    70    20    30     0     0
     0     0     0     0    40    50    70    20    30
     0     0     0     0     0     0    40    50    60

【讨论】:

  • @HansHirse 我试图概括。在一般情况下N 可能无法实现,所以我改为固定重复次数R
  • 这是一个非常简洁的解决方案,谢谢。变量miniM 是否有类似的简洁方法?例如,如果miniMdeepMiniM = randi(4,2,2,9); 替换,我对stackOverflow 不太熟悉,所以我不确定这是否适合单独的问题线程。
  • @JasonTracey 你的意思是使用 3D 数组而不是 2D 作为输入吗?是的,这已经足够不同,值得提出一个新问题,我认为 — 我不确定在这种情况下所需的输出是什么
  • 是的,使用 3D 数组作为输入,但像以前一样产生 2D 输出。使用我最初的示例,这可以通过将 for 循环内的代码替换为:M(i:i+1,i:i+1) = M(i:i+1,i:i+1) + deepMiniM(:,:,i); 并使用前面定义的deepMiniM 来实现。只要这不是微不足道的,我将把它作为一个新问题提交。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 2021-12-12
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多