Cell of Strings, using cell2mat gives Dimensions of arrays being concatenated are not consistent.
조회 수: 76 (최근 30일)
이전 댓글 표시
I've got an excel document with lots of fancy editing that I'm trying to do processing on.
I've imported it as a table since rows may change over time and I'd like to be able to use row names to reference table data. I need to make some changes to the first column in order to use T.Properties.RowNames
Here's been the process so far, Import as table > grab the first column with table2array > this gives an array of cells > replace all the 0x0 char empty cells with a unique string > use cell2mat to convert to an array of strings > pass string array to T.Properties.RowNames
however, when I go to use cell2mat I get the error "Dimensions of arrays being concatenated are not consistent."
can't figure out what's causing it, I tried using which was a fix I found elsewhere to check for empty cells that may be the cause:
isEm = cellfun( @isempty, namerows ) ;
data = cell2mat( namerows(~isEm) ) ;
but the cell2mat function in this fix returns the same error
Any help would be appreciated
Here's my code:
%impot table, extract first column, convert to an array of cells
T = readtable('3-22 week 3.xlsx');
namerows = T(:,1);
namerows = table2array(namerows);
%array of numbers to be passed to sprintf to ensure each row has a unique
%name
nullname = 1:length(namerows);
%replace any unnamed rows with a string
for n = 1:length(namerows)
if (namerows{n,1} == "")
namerows{n,1} = sprintf('null%d',nullname(n))
end
end
%double check there are no empty cells
isEm = cellfun( @isempty, namerows ) ;
data = cell2mat( namerows(~isEm) ) ; %CODE FAILS HERE
namerows = cell2mat(namerows)
채택된 답변
Voss
2022년 4월 14일
I'm not sure why you want to use cell2mat to convert a cell array of character vectors to an array of strings. You can use string for that:
% cell array of character vectors:
namerows = repmat({'name'},10,1);
namerows{4} = ''; % some are empty
%replace any unnamed rows with a string
nullname = 1:length(namerows);
for n = 1:length(namerows)
if (namerows{n,1} == "")
namerows{n,1} = sprintf('null%d',nullname(n));
end
end
disp(namerows) % none are empty -> removing empties before cell2mat won't matter
try
namerows = cell2mat(namerows)
catch ME
disp(ME.message);
namerows = string(namerows)
end
cell2mat on a cell array of character vectors will attempt to concatenate the character vectors, so they have to have consistent sizes:
cell2mat({'this_';'is_ok'})
cell2mat({'this_';'is_not'})
댓글 수: 2
Voss
2022년 4월 14일
You're welcome!
If it had been a cell array of strings, you would've gotten a different error (but using string to convert to a string array would still work):
% cell array of *strings*:
namerows = repmat({"name"},10,1);
namerows{4} = ""; % some are empty
%replace any unnamed rows with a string
nullname = 1:length(namerows);
for n = 1:length(namerows)
if (namerows{n,1} == "")
namerows{n,1} = sprintf('null%d',nullname(n)); % this is a character vector
end
end
disp(namerows) % some strings, some character vectors
try
% the error you'd get here is:
% "All contents of the input cell array must be of the same data type."
namerows = cell2mat(namerows)
catch ME
disp(ME.message);
% this works the same whether it's a cell array of character vectors or
% strings (or some of both)
namerows = string(namerows)
end
추가 답변 (0개)
참고 항목
카테고리
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!