Build Matrix from X and Y Coords and Corresponding Values

33 vues (au cours des 30 derniers jours)
Ben
Ben le 9 Nov 2022
Commenté : Ben le 16 Nov 2022
Hello,
I have three vectors and I want to construct a matrix from them.
  • 'a' is a vector of length n, containing magnitude data.
  • 't' is a vector (also length n) of time indices at which the samples in 'a' occur.
  • 'f' is a vector (length m) of frequency indices at which the samples in 'a' occur.
t = 1:1:2500; % Vector of sample indices
f = 1:1:100; % Vector of frequency indices
a = rescale(square(t)); % Vector of magnitude values
How can I construct matrix 'M' with each value in 'a' occurring at the corresponding coordinate in (t, f), and all other indices in 'M' = 0?
  • Using diag(a) does not work, because 't' and 'f' are of different lengths. I can resample or interpolate 'M' to change the resulting square matrix into a rectangular one, but this corrupts the data. I do not want to reduce the number of rows of M by decimation, but rather by allowing 'r' values of m to occupy each row.
% diag and resamp method - does not work.
M = diag(a);
% ratio of 't' to 'f'
r = length(t) / length(f);
% resample 'M' to dimensions of [length(f) x length(t)]
M_rect = resample(M, 1, r, 'Dimension', 2);
  • I have tried simply writing element-by-element into 'M' in a for-loop, however for obvious reasons, this leaves me with a square matrix of either nxn. Essentially this is identical to diag(a).
% Single index Loop method - does not work
for i = 1:length(t)
M(i, i) = a(i);
end
  • I have tried writing element-by-element into 'M' in two nested for-loops with row and column indices, however this results in 'M' having correct dimensions, but the values of 'a' fill every column. Essentially this is identical to diag(a).
% Dual index Loop method - does not work
for i = 1:length(t)
for j = 1:length(f)
M(j, i) = a(i);
end
end
This seems like it should be quite simple, but it's been wrecking my head. Any help would be most appreciated.
Thanks in advance,
Ben
  1 commentaire
Matt J
Matt J le 9 Nov 2022
What are the intended dimensions of M? How is it that "f is a vector (length m) of frequency indices at which the samples in 'a' occur" but length(f)~=length(a)?.

Connectez-vous pour commenter.

Réponse acceptée

Matt J
Matt J le 9 Nov 2022
Modifié(e) : Matt J le 9 Nov 2022
Generally speaking, if you have a list of (t,f) coordinates with corresponding values a, you can use accumarray, e.g.,
t=[1,2,3]';
f=[2,2,5]';
a=rand(1,3)'
a = 3×1
0.0438 0.2643 0.2258
M=accumarray([t,f],a,[5,6])
M = 5×6
0 0.0438 0 0 0 0 0 0.2643 0 0 0 0 0 0 0 0 0.2258 0 0 0 0 0 0 0 0 0 0 0 0 0
Or, you can use sparse,
M=sparse(t,f,a,5,6);
full(M)
ans = 5×6
0 0.0438 0 0 0 0 0 0.2643 0 0 0 0 0 0 0 0 0.2258 0 0 0 0 0 0 0 0 0 0 0 0 0
  3 commentaires
Matt J
Matt J le 15 Nov 2022
Modifié(e) : Matt J le 15 Nov 2022
These variables are never used
f = linspace(f1, f2, nf); % Vector of frequencies (Hz)
a = rescale(square(t)); % Vector of magnitude values
so I have had to add some "if" statements to pad extra zeros or trim end samples in cases where f_indices ends up being the wrong length
What should happen if it is the wrong length? Should f_indices grow/shrink to 2500 or should t change length to accomodate f_indices?
Ben
Ben le 16 Nov 2022
Thanks Matt, I've cleaned up my code and I'm happy with it now.
I appreciate your help.
Chers,
Ben

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Produits


Version

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by