I have a 15x20 cell matrix, and I would to concatenate all the elements of each cell along the columns. That is, I want to move from the 15x20 cell matrix to 1x20 cell array. I attach a file as an example. To be clear, in my case the resulting CELL{2} mu to have 101 elements, CELL{3} 119 elements and so on.
Is there a way to do this without a for loop? Thanks and I hope I was clear.

 採用された回答

Stephen23
Stephen23 2025 年 2 月 25 日

0 投票

C = load('CellMatrixExample.mat').EmissivityMat
C = 15x20 cell array
Columns 1 through 10 {31964x1 single} {46x1 single} {23x1 single} {18x1 single} {29x1 single} {13x1 single} {13x1 single} {23x1 single} {26x1 single} {17x1 single} {31940x1 single} {55x1 single} {41x1 single} {22x1 single} { 6x1 single} {25x1 single} {21x1 single} {19x1 single} {22x1 single} {26x1 single} {31979x1 single} { 0x0 double} {55x1 single} {29x1 single} {12x1 single} {14x1 single} {32x1 single} {19x1 single} {17x1 single} {21x1 single} {32038x1 single} { 0x0 double} { 0x0 double} {52x1 single} {18x1 single} {24x1 single} {16x1 single} {22x1 single} {15x1 single} {15x1 single} {32088x1 single} { 0x0 double} { 0x0 double} { 0x0 double} {36x1 single} {34x1 single} {24x1 single} {12x1 single} {18x1 single} {12x1 single} {32137x1 single} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} {36x1 single} {34x1 single} {22x1 single} {11x1 single} {16x1 single} {32177x1 single} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} {36x1 single} {31x1 single} {14x1 single} {10x1 single} {32219x1 single} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} {34x1 single} {26x1 single} {12x1 single} {32293x1 single} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} {20x1 single} {18x1 single} {32365x1 single} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 4x1 single} {32479x1 single} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} {32599x1 single} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} {32776x1 single} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} {32936x1 single} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} {33142x1 single} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} Columns 11 through 20 {31x1 single} {11x1 single} {14x1 single} {13x1 single} {15x1 single} {23x1 single} {25x1 single} {18x1 single} {29x1 single} {12x1 single} { 7x1 single} {25x1 single} {10x1 single} {14x1 single} {21x1 single} {22x1 single} {23x1 single} {25x1 single} { 9x1 single} {24x1 single} { 9x1 single} {10x1 single} {17x1 single} {21x1 single} {23x1 single} {20x1 single} {20x1 single} {22x1 single} {10x1 single} {11x1 single} {14x1 single} {11x1 single} {15x1 single} {22x1 single} {17x1 single} {21x1 single} {18x1 single} {17x1 single} {11x1 single} {14x1 single} {10x1 single} {20x1 single} {13x1 single} {20x1 single} {17x1 single} {14x1 single} {17x1 single} {13x1 single} { 6x1 single} {15x1 single} { 5x1 single} {14x1 single} {27x1 single} { 9x1 single} {19x1 single} {15x1 single} {12x1 single} {14x1 single} { 6x1 single} { 9x1 single} {10x1 single} { 7x1 single} {23x1 single} {29x1 single} { 7x1 single} {19x1 single} {14x1 single} {12x1 single} { 5x1 single} { 6x1 single} { 7x1 single} {16x1 single} {10x1 single} {20x1 single} {22x1 single} { 6x1 single} {17x1 single} {14x1 single} {10x1 single} { 7x1 single} {13x1 single} {16x1 single} {20x1 single} { 8x1 single} {18x1 single} {19x1 single} { 5x1 single} {15x1 single} { 4x1 single} {13x1 single} {16x1 single} {21x1 single} {20x1 single} {20x1 single} { 7x1 single} {15x1 single} {17x1 single} { 4x1 single} { 4x1 single} { 8x1 single} {[ 0.5438]} {19x1 single} {20x1 single} {17x1 single} {15x1 single} { 6x1 single} {12x1 single} {10x1 single} { 3x1 single} { 9x1 single} { 0x0 double} {[ 0.5438]} {19x1 single} {14x1 single} {14x1 single} {11x1 single} { 4x1 single} { 8x1 single} {[ 0.5440]} { 8x1 single} { 0x0 double} { 0x0 double} {[ 0.5438]} {18x1 single} { 9x1 single} {11x1 single} { 9x1 single} {[ 0.5443]} { 0x0 double} { 4x1 single} { 0x0 double} { 0x0 double} { 0x0 double} {[ 0.5438]} {13x1 single} { 3x1 single} { 5x1 single} { 0x0 double} { 0x0 double} { 4x1 single} { 0x0 double} { 0x0 double} { 0x0 double} { 0x0 double} {[ 0.5438]} { 7x1 single} { 0x0 double} { 0x0 double} { 0x0 double} {[ 0.5441]}
F = @(c)vertcat(c{:});
C = cellfun(F,num2cell(C,1),'uni',0)
C = 1x20 cell array
Columns 1 through 9 {485132x1 single} {101x1 single} {119x1 single} {121x1 single} {101x1 single} {146x1 single} {176x1 single} {182x1 single} {169x1 single} Columns 10 through 19 {151x1 single} {123x1 single} {171x1 single} {209x1 single} {226x1 single} {218x1 single} {212x1 single} {198x1 single} {173x1 single} {98x1 single} Column 20 {145x1 single}

2 件のコメント

Leo Pio D'Adderio
Leo Pio D'Adderio 2025 年 2 月 25 日
Hi Stephen,
thanks! It work perfectly. However, it seems that the "for loop version" that you put as first answer (I suppose you removed it) works faster than this.
Anyway, I am very grateful for the help.
Stephen23
Stephen23 2025 年 2 月 25 日
"However, it seems that the "for loop version" that you put as first answer (I suppose you removed it) works faster than this."
Yes, I would expect that a well-written FOR-loop would be faster than CELLFUN. Unfortunately there is a persistent myth that loops should be avoided in all cases... I have no idea why this myth is so persistent.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File Exchange で Creating and Concatenating Matrices についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by