Build Matrix from X and Y Coords and Corresponding Values

35 ビュー (過去 30 日間)
Ben
Ben 2022 年 11 月 9 日
コメント済み: Ben 2022 年 11 月 16 日
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 件のコメント
Matt J
Matt J 2022 年 11 月 9 日
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)?.

サインインしてコメントする。

採用された回答

Matt J
Matt J 2022 年 11 月 9 日
編集済み: Matt J 2022 年 11 月 9 日
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 件のコメント
Matt J
Matt J 2022 年 11 月 15 日
編集済み: Matt J 2022 年 11 月 15 日
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 2022 年 11 月 16 日
Thanks Matt, I've cleaned up my code and I'm happy with it now.
I appreciate your help.
Chers,
Ben

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

製品


リリース

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by