Zero pad vectors within cell array to make them equal length

조회 수: 27 (최근 30일)
skrowten_hermit
skrowten_hermit 2020년 10월 9일
댓글: Star Strider 2020년 10월 12일
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?

채택된 답변

Star Strider
Star Strider 2020년 10월 9일
편집: Star Strider 2020년 10월 9일
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
skrowten_hermit
skrowten_hermit 2020년 10월 12일
Point noted! Yeah. Mine has large amounts of data. Will make the changes as you have suggested. Thanks.
Star Strider
Star Strider 2020년 10월 12일
As always, my pleasure!

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

제품


릴리스

R2017b

Community Treasure Hunt

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

Start Hunting!

Translated by