Effacer les filtres
Effacer les filtres

How to multiply vectors not the same size to create 3d tensor?

6 vues (au cours des 30 derniers jours)
Noya Linder
Noya Linder le 23 Juil 2023
Commenté : Voss le 15 Août 2023
Hi! I have a function that receives a few scalars along with a few vectors that calculates a certain value. I use the following for loop in order to fill in a 3D tensor that contains all results from all possible combinations of these three vectors:
Z3 = zeros(length(T), length(Rtry), length(theta));
x = 0;
y = 0;
z = 0;
for tt = t_obs
x = x+1;
y = 0;
for rr = Rtry
y = y+1;
z = 0;
for mm = mu
z = z + 1;
Z3(x, y, z) = toint(3, Rtry(y), t_obs(x), RT1, t_obs, dRdtT1, mu(z));
end
end
end
I want to vectorize this code but I'm having some trouble understanding how. I wrote this line
Ztry = toint(3, Rtry, t_obs, RT1, t_obs, dRdtT1, mu);
but I get the following error
Error using *
Incorrect dimensions for matrix multiplication. Check that the number of columns in the first matrix matches the
number of rows in the second matrix. To operate on each element of the matrix individually, use TIMES (.*) for
elementwise multiplication.
that occures in the following function:
function getTime = getShockFrameTime(t, r, mu)
c = 29979245800; %cm/s
getTime = t + r*mu/c;
end
with t, r and mu being the vectors t_obs, Rtry and mu, respectively.
The vectors are different lengths and I want it to return a 3D tensor, not a vector.
Thank you in advance :)

Réponses (1)

Voss
Voss le 23 Juil 2023
Modifié(e) : Voss le 23 Juil 2023
One thing you can do is reshape your vectors as desired and use .*, for example:
t_obs = [1 2 3]*1e-6;
Rtry = [4 5 6 7]*1e2;
mu = [8 9];
result = getShockFrameTime(t_obs, Rtry, mu);
size(result)
ans = 1×3
3 4 2
disp(result)
(:,:,1) = 1.0e-05 * 0.1107 0.1133 0.1160 0.1187 0.2107 0.2133 0.2160 0.2187 0.3107 0.3133 0.3160 0.3187 (:,:,2) = 1.0e-05 * 0.1120 0.1150 0.1180 0.1210 0.2120 0.2150 0.2180 0.2210 0.3120 0.3150 0.3180 0.3210
function getTime = getShockFrameTime(t, r, mu)
c = 29979245800; %cm/s
getTime = reshape(t,[],1) + reshape(r,1,[]).*reshape(mu,1,1,[])/c;
% reshaping like this, size(getTime) is [numel(t) numel(r) numel(mu)]
% adjust as necessary
end

Catégories

En savoir plus sur Operators and Elementary Operations dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by