Interleaving columns of two cell arrays

조회 수: 17 (최근 30일)
Raphael Chazelle
Raphael Chazelle 2016년 5월 19일
편집: the cyclist 2016년 5월 19일
Hey all,
I have two cell arrays:
  • ca = 7x9 cell array where each cell is a block of pixels 64x64x3
  • ca2 = 7x8 cell array where each cell is a block of pixels 64x64x3
I would like to interleave the cell array by columns like so:
  • ca3 = {ca{:,1};ca2{:,1};ca{:,2};ca2{:,2};ca{:,3};ca2{:,3};ca{:,4};ca2{:,4};ca{:,5};ca2{:,5};ca{:,6};ca2{:,6};ca{:,7};ca2{:,7};ca{:,8};ca2{:,8};ca{:,9}}';
I'm sure there has to be a more programmatic way of doing this and in a more extensible fashion(where if I have more then 8/9 columns I wouldn't have to keep adding to the code).
Thanks! Hope this makes sense

채택된 답변

Kirby Fears
Kirby Fears 2016년 5월 19일
편집: Kirby Fears 2016년 5월 19일
Here's a function I wrote for you. It contains a subfunction to create the interleaving index. Save this to interleaveCells.m and try calling it.
function c = interleaveCells(c1,c2)
% Make index for interleaving cells
ind = interleaveIndex(size(c1,2),size(c2,2));
% Combine cells
c = [c1, c2];
% Interleave cells
c = c(:,ind);
function ind = interleaveIndex(n1,n2)
ind = NaN(1, n1 + n2);
i = 1;
j = 1;
while i<=n1,
ind(i+j-1) = i;
i = i + 1;
if j<=n2,
ind(i+j-1) = n1 + j;
j = j + 1;
end
end
while j<=n2,
ind(i+j-1) = n1 + j;
j = j + 1;
end
Hope this helps.
  댓글 수: 2
Raphael Chazelle
Raphael Chazelle 2016년 5월 19일
Works like a charm. Thanks!
Kirby Fears
Kirby Fears 2016년 5월 19일
Great. I am editing in a change that simplifies the subfunction as well.
Cheers.

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

추가 답변 (2개)

the cyclist
the cyclist 2016년 5월 19일
I think this does what you want
% Your actual data here. (These are empty, but wouldn't be for your application)
ca = cell(7,9);
ca2 = cell(7,8);
% Append extra, empty column of cells, so that we can concatenate below
ca2_tmp = [ca2, cell(7,1)];
% Concatenate top-to-bottom, then reshape
ca3 = reshape([ca;ca2_tmp],7,18);
% Trim spurious final column
ca3(:,end) = [];
  댓글 수: 1
Raphael Chazelle
Raphael Chazelle 2016년 5월 19일
This one works! the one below is close but not the desired output!

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


the cyclist
the cyclist 2016년 5월 19일
편집: the cyclist 2016년 5월 19일
ca3 = [ca,ca2];
idx = reshape(1:18,[],2)'
ca3 = ca3(:,idx(1:end-1));
EDIT: Fixed this to get the indexing right. Arguably a bit easier than my other solution, but basically works on the same principle.

카테고리

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

Community Treasure Hunt

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

Start Hunting!

Translated by