Zero pad vectors within cell array to make them equal length

14 vues (au cours des 30 derniers jours)
skrowten_hermit
skrowten_hermit le 9 Oct 2020
Commenté : Star Strider le 12 Oct 2020
I have a cell array with vectors y1, y2, y3, y4, y5 which are of variable lengths. I get the maximum length among all elements in the cell array using:
sigvecarray = {y1, y2, y3, y4, y5};
[maxsamples, idx] = max(cellfun(@numel, sigvecarray));
Now, I need to zero pad the shorter vectors with the differrence from maxsmaples and their own sample numbers.
I tried the following first:
signalvectors = {}
for k = 1:numel(sigvecarray)
currveclength = length(sigvecarray{k})
if currveclength < maxsamples
padding = samples - currveclength
signalvectors{k} = [sigvecarray{k}, zeros(padding, 1)]
end
end
It gave me the follwing error:
Error using horzcat
Dimensions of matrices being concatenated are not consistent.
Then I tried the solution from the post here as follows:
origsamplesarray = cellfun(@numel, sigvecarray);
padfun = @(k) [sigvecarray{k} zeros(maxsamples(k) - origsamplesarray(k), 1)] ;
signalvectors = arrayfun(padfun, 1:numel(sigvecarray) , 'un', 0);
It gave me the following error:
Error using horzcat
Dimensions of matrices being concatenated are not consistent.
Error in xcorr>@(k)[sigvecarray{k},zeros(maxsamples(k)-origsamplesarray(k),1)]
What am I possibly doing wrong above?

Réponse acceptée

Star Strider
Star Strider le 9 Oct 2020
Modifié(e) : Star Strider le 9 Oct 2020
I do not know what the dimensions of ‘sigvecarray’ are, however I assume they are all column vectors.
If so, replace the (,) with a (;) here, and it should work (unless there are also other problems):
signalvectors{k} = [sigvecarray{k}; zeros(padding, 1)]
EDIT — (9 Oct 2020 at 12:34)
All of these — including this:
padfun = @(k) [sigvecarray{k} zeros(maxsamples(k) - origsamplesarray(k), 1)] ;
function — are concatenating something with a column vector, that column vector being defined as:
zeros(maxsamples(k) - origsamplesarray(k), 1)
If ‘sigvecarray{k}’ is a row vector or even another column vector of a different length, that error will be thrown, since (,) is a horizontal concatenation operator.
If ‘sigvecarray{k}’ is a column vector (and that is still unknown), concatenate them vertically — not horizontally — using the (;) vertical concatenation operator:
padfun = @(k) [sigvecarray{k}; zeros(maxsamples(k) - origsamplesarray(k), 1)] ;
↑ ← VERTICAL CONCATENATION OPERATOR
.
  5 commentaires
skrowten_hermit
skrowten_hermit le 12 Oct 2020
Point noted! Yeah. Mine has large amounts of data. Will make the changes as you have suggested. Thanks.
Star Strider
Star Strider le 12 Oct 2020
As always, my pleasure!

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Produits


Version

R2017b

Community Treasure Hunt

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

Start Hunting!

Translated by