Move empty cell in a row
3 ビュー (過去 30 日間)
古いコメントを表示
Hello, I've a cell array structured like this:
{1,2,3,4,5,[],[],[];
6,7,8,[],9,10,[],[];
11,12,13,[],[],[],14,15}
I would like to move the empty cell at the end of the row to eliminate the column after and have only 5 columns and no more 8. How can I do?
Thanks a lot, Lorenzo
0 件のコメント
採用された回答
Guillaume
2018 年 5 月 11 日
Another option, which may or may not be faster than Rik's (I haven't tested but I suspect it's faster since it doesn't do any sorting:
C = {1,2,3,4,5,[],[],[];
6,7,8,[],9,10,[],[];
11,12,13,[],[],[],14,15}
newC = C'; %tranpose since matlab works by column
newC = newC(~cellfun(@isempty, newC)); %remove all empty cells
newC = reshape(newC, [], size(C, 1))'
This assumes that there is the same number of empty cells in each row.
2 件のコメント
Rik
2018 年 5 月 11 日
This is faster by about a factor of 2 (at least for this example on my machine, your mileage may vary).
So if you are certain this condition is true, use this code, if not, use mine. You could of course put it in a try-catch block.
その他の回答 (1 件)
Rik
2018 年 5 月 11 日
編集済み: Rik
2018 年 5 月 11 日
Does cell2mat work for you? I you want to keep it as a cell, you can also follow it up with num2cell.
A={1,2,3,4,5,[],[],[];
6,7,8,[],9,10,[],[];
11,12,13,[],[],[],14,15};
B1=cell2mat(A);
B2=num2cell(cell2mat(A));
In cases where each non-empty cell contains arrays, or different data types, the code below can be used, although there might be a more elegant/faster method.
A={1,2,3,4,5,[],[],[];
6,7,8,[],9,10,[],[];
11,12,13,[],[],[],14,15};
for row=1:size(A,1)
temp=A(row,:);
bin=cellfun('isempty',temp);%much faster than @isempty
[~,order]=sort(bin);%sort the empty cells to the back
A(row,:)=A(row,order);%might be a few ms faster than A(row,:)=temp(order);
end
%remove all completely empty columns
A(:,all(cellfun('isempty',A),1))=[];
2 件のコメント
参考
カテゴリ
Help Center および File Exchange で Data Type Conversion についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!