Zero pad vectors within cell array to make them equal length
29 views (last 30 days)
Show older comments
skrowten_hermit
on 9 Oct 2020
Commented: Star Strider
on 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.
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?
0 Comments
Accepted Answer
Star Strider
on 9 Oct 2020
Edited: Star Strider
on 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 Comments
More Answers (0)
See Also
Categories
Find more on Logical in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!