Efficient way to multiply a vector of size (Nx,1) with a matrix of size (Nx+1,Nx+1)
6 views (last 30 days)
My code repeatedly computes a vector of size (Nx,1) by a matrix of size (Nx+1,Nx+1):
clc; clear all;
Nx = 32;
a = 1.5;
b = 2;
gamma = rand(Nx,1);
D = rand(Nx+1,Nx+1);
D2 = D*D;
identy = eye(Nx+1,Nx+1);
% Computation performed by my code millions of times
A = a*D2 + b*D + gamma(j)*identy;
% Can gamma(j)*identy be avoided through vectorization or a faster
Is there an alternative way to compute A without using the for loop (would vectorization or repmat also work)?
the cyclist on 28 Jul 2021
If you permute gamma to be a vector along the dimension 3, then you can multiply it by identy, and the result will be a 33x33x32 array, where each "slice" along dimension 3 is the multiple with the corresponding value of gamma.
So, this calculation will do all of the calculations of your for loop (and store them all, rather than overwriting as your code does).
A = a*D2 + b*D + permute(gamma,[3,2,1]) .* identy;
You may now have a memory problem, though, if your arrays are large.