Filter löschen
Filter löschen

find size uniformity in matlab along a cell array

1 Ansicht (letzte 30 Tage)
ludvikjahn
ludvikjahn am 5 Mär. 2015
Bearbeitet: Stephen23 am 9 Mär. 2015
good morning, I have a cell array like:
A= {[1 19 65];[ 5];[8 8 3]; [9 7 43]}
and I want to know if its dimensions are costant along the array (of course in this case the answer should be negative because it is made of 3 [1 x 3] cells and one [1 x 1] cell). Any idea about how to do it without a for loop?
Thanks

Antworten (2)

Adam
Adam am 5 Mär. 2015
dim = size( A{1} );
allDimsSame = all( cellfun( @(x) isequal( size(x), dim ), A ) );
will give you the correct answer, but is likely slower than a simple for loop, especially if you have a vast cell array and the 2nd element differs in size from the first which would terminate a loop immediately after 1 comparison.
  2 Kommentare
ludvikjahn
ludvikjahn am 5 Mär. 2015
Bearbeitet: ludvikjahn am 5 Mär. 2015
ok, and if i wanted, (even with a for cycle) to cut the cell array when it encounters a different size cell? (in this case it should be cut at the first cell)
or even exclude those cell which do not have tha same size as the first one? Thanks
Adam
Adam am 5 Mär. 2015
Bearbeitet: Adam am 5 Mär. 2015
allDimsSame = true;
dim = size( A{1} );
for i = 2:numel(A)
if ~isequal( size( A{i} ), dim )
allDimsSame = false;
break;
end
end
should jump out of a for loop as soon as a cell containing a different sized element is found.
If you want to exclude cells of a different size to the first then we should go back to the first answer (or a for loop equivalent of it which is likely still faster even without early termination) with a slight change:
dimsSame = cellfun( @(x) isequal( size(x), dim ), A );
A( ~dimsSame ) = [];
dimsSame is a logical array so everywhere it is 0 the cell contents were a different size so we just replace them with empty which deletes them from the array.
Whatever you do, do not attempt to delete elements from the cell array in the middle of a for loop!

Melden Sie sich an, um zu kommentieren.


Stephen23
Stephen23 am 5 Mär. 2015
Bearbeitet: Stephen23 am 9 Mär. 2015
The cellfun options listed under "Backwards Compatibility" are much faster than normal cellfun calls:
>> A = {[1,19,65]; [5]; [8,8,3]; [9,7,43]};
>> any(diff(cellfun('size',A,1))) % check the first dimension
ans = 0
>> any(diff(cellfun('size',A,2))) % check the second dimension
ans = 1
tell us that one of the column sizes is different.
  1 Kommentar
Guillaume
Guillaume am 5 Mär. 2015
Yes, isn't it ironic that a deprecated syntax is much more performant than its replacement?

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by