Build Matrix from X and Y Coords and Corresponding Values

20 visualizaciones (últimos 30 días)
Ben
Ben el 9 de Nov. de 2022
Comentada: Ben el 16 de Nov. de 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 comentario
Matt J
Matt J el 9 de Nov. de 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)?.

Iniciar sesión para comentar.

Respuesta aceptada

Matt J
Matt J el 9 de Nov. de 2022
Editada: Matt J el 9 de Nov. de 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 comentarios
Matt J
Matt J el 15 de Nov. de 2022
Editada: Matt J el 15 de Nov. de 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 el 16 de Nov. de 2022
Thanks Matt, I've cleaned up my code and I'm happy with it now.
I appreciate your help.
Chers,
Ben

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Productos


Versión

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by