Векторизация кода для вставки nxn-матриц в трехмерный массив по диагонали большой матрицы - PullRequest
1 голос
/ 21 октября 2019

Как и в моем предыдущем вопросе Я пытаюсь вставить маленькие квадратные матрицы вдоль диагонали большой матрицы. Однако эти матрицы теперь содержатся в трехмерном массиве и имеют разные значения. Как и прежде, необходимо добавлять перекрывающиеся значения, а маленькие матрицы вставляются только в том случае, если они могут полностью поместиться внутри большой матрицы. Размер шага всегда будет равен 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

Желаемый результат - матрица N x N с заполненными 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

1 Ответ

2 голосов
/ 21 октября 2019

При этом используется неявное расширение , а также sparse для добавления значений при совпадающих индексах и (:) индексирование для линеаризации матрицыв обычном мажорном порядке .

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
...