Efficient way to multiply a vector of size (Nx,1) with a matrix of size (Nx+1,Nx+1)
1 visualizzazione (ultimi 30 giorni)
Mostra commenti meno recenti
Matthew Kehoe
il 28 Lug 2021
Commentato: the cyclist
il 29 Lug 2021
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
for j=1:Nx
A = a*D2 + b*D + gamma(j)*identy;
% Can gamma(j)*identy be avoided through vectorization or a faster
% technique?
end
Is there an alternative way to compute A without using the for loop (would vectorization or repmat also work)?
2 Commenti
Matt J
il 28 Lug 2021
In your example code, A does not evolve throughout the loop. Rather it is repeatedly over-written resulting in
A = a*D2 + b*D + gamma(Nx);
This is probably not what you want, but the reader cannot tell what it should really be doing.
Risposta accettata
the cyclist
il 28 Lug 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.
5 Commenti
the cyclist
il 29 Lug 2021
That's fine, but if the question is self-contained, it might be better to open a new one, because it might get wider exposure.
You can always tag me as you did in your comment, and I will get a notification.
Più risposte (0)
Vedere anche
Categorie
Scopri di più su Matrix Indexing in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!