remove all strings from nested cell array

조회 수: 3 (최근 30일)
Davindra Usov
Davindra Usov 2022년 6월 22일
댓글: Davindra Usov 2022년 7월 7일
Hi,
I'm trying to remove all string/chars from a 4x10 cell array where each cell in the array contains a 40x1 column vector (so as you can see, it's nested). Most commands I usually use such as cell2mat don't work on this because the cell array is nested.
Or, if preferred, is there a way to read in all the elements of a certain column in one of the cells in a cell array apart from the elements containing strings? e.g:
col=rand(4,10) %matrix containing column indices
for i=1:4
for j=1:10
new_cell_arrray{i,j}=g{i,1}(:,col(i,j)); %g is another (existing) 4x1 cell array and new_cell_array is 4x10.
end
end
Thank you
  댓글 수: 1
Walter Roberson
Walter Roberson 2022년 6월 22일
If you "remove" an entry from a 2D array, the result cannot be a 2D array any more.

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

채택된 답변

Walter Roberson
Walter Roberson 2022년 6월 22일
C = num2cell(randi(9,4,10));
C(randperm(numel(C), 4)) = {"string"};
C(randperm(numel(C), 4)) = {'chars'};
C
C = 4×10 cell array
{[5]} {[ 8]} {[5]} {[6]} {[1]} {[ 8]} {'chars'} {'chars' } {["string"]} {'chars'} {[3]} {["string"]} {[4]} {[1]} {[2]} {["string"]} {[ 1]} {[ 9]} {[ 5]} {[ 8]} {[8]} {[ 5]} {[4]} {[8]} {[9]} {[ 2]} {[ 1]} {[ 5]} {[ 6]} {[ 7]} {[3]} {[ 3]} {[5]} {[1]} {[5]} {[ 2]} {'chars'} {["string"]} {[ 9]} {[ 8]}
for K = 1 : size(C,2)
mask = ~cellfun(@(c)ischar(c)||isstring(c), C(:,K));
subset{K} = C(mask, K);
end
subset
subset = 1×10 cell array
{4×1 cell} {3×1 cell} {4×1 cell} {4×1 cell} {4×1 cell} {3×1 cell} {2×1 cell} {2×1 cell} {3×1 cell} {3×1 cell}
subset{1}, subset{2}
ans = 4×1 cell array
{[5]} {[3]} {[8]} {[3]}
ans = 3×1 cell array
{[8]} {[5]} {[3]}
  댓글 수: 5
Walter Roberson
Walter Roberson 2022년 6월 24일
"In each cell, I have 4 strings and 36 numbers."
Okay, I will generate 4 strings and 36 numbers per cell.
for J = 1 : 4
for K = 1 : 10
thiscell = num2cell(randi(9, 40, 1));
rp = randperm(40,4);
thiscell(rp) = {"string"};
C{J,K} = thiscell;
end
end
whos C
Name Size Bytes Class Attributes C 4x10 206080 cell
C{1}
ans = 40×1 cell array
{[ 4]} {[ 1]} {[ 4]} {[ 4]} {[ 1]} {[ 3]} {[ 1]} {[ 6]} {[ 4]} {["string"]} {[ 4]} {[ 7]} {["string"]} {[ 1]} {[ 3]} {[ 5]}
subset = cell(size(C));
for J = 1 : numel(C)
mask = ~cellfun(@(c)ischar(c)||isstring(c), C{J});
subset{J} = C{J}(mask);
end
whos subset
Name Size Bytes Class Attributes subset 4x10 165440 cell
subset{1}
ans = 36×1 cell array
{[4]} {[1]} {[4]} {[4]} {[1]} {[3]} {[1]} {[6]} {[4]} {[4]} {[7]} {[1]} {[3]} {[5]} {[5]} {[5]}
and see that after the filtering, there are 36 entries left. All of the string() objects and character vectors have been removed.
Davindra Usov
Davindra Usov 2022년 7월 7일
Thank you so much! it worked :D

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

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Characters and Strings에 대해 자세히 알아보기

제품


릴리스

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by