Zero pad vectors within cell array to make them equal length

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 日

1 投票

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 月 9 日
Thanks a lot. I feel silly. This is a classic yet longer method I knew would work.
Any idea what is going wrong with the following:
origsamplesarray = cellfun(@numel, sigvecarray);
padfun = @(k) [sigvecarray{k} zeros(maxsamples(k) - origsamplesarray(k), 1)] ;
signalvectors = arrayfun(padfun, 1:numel(sigvecarray) , 'un', 0);
skrowten_hermit
skrowten_hermit 2020 年 10 月 12 日
Sorry, I forgot to mention with a proper edit. 'sigvecarray' is a cell array with dimensions 1x8 holding vectors (of size between 64000-72000) in each of 8 columns. I made the following changes after taking care of the error pointed out by you (the error was that I had mistaken added 'maxsamples(k)' instead of 'maxsamples':
origsamplesarray = cellfun(@numel, sigvecarray);
padfun = @(k) [sigvecarray{k}; zeros(maxsamples - origsamplesarray(k), 1)] ;
signalvectors = arrayfun(padfun, 1:numel(sigvecarray) , 'un', 0);
for k = 1:numel(signalvectors)
disp(length(signalvectors{k}))
end
And I see that the new 'signalvectors' has all cells with vectors of size 'maxsamples'.
Star Strider
Star Strider 2020 年 10 月 12 日
The only change I would suggest is to replace the arrrayfun call with a simple for loop. The arrayfun function is fine for some purposes, however it is much slower and less efficient than a for loop. With large amounts of data, that ineffficiency can become significant.
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 件)

カテゴリ

ヘルプ センター および File ExchangeLoops and Conditional Statements についてさらに検索

製品

リリース

R2017b

Community Treasure Hunt

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

Start Hunting!

Translated by