我有一个1x N 单元格,称之为X
,其组件X{i}
({1,2}中的i
,<,< em> N }) M x1单元格的字符串或 M x1数字向量。
注意:X
包含两个文本单元格和数字向量的事实排除了在此使用cell2mat
:
>> tmp = cell2mat(X);
Error using cell2mat (line 46)
All contents of the input cell array must be of the same data type.
我的问题是:
将这些数据转换为 M 1x N 单元数组的MATLAB“惯用”方法是什么?
编辑:要清楚,我想要到达的数据结构,我们称之为Y
,是一个 M - 长的1x N 数组细胞(每个细胞由数字和字符串组成)。例如,如果 N = 2,并且X{1}
是字符串的 M x1单元格,而X{2}
是 M x1双精度矢量,那么所需的数据结构Y
是这样的,对于任何1≤i
≤ M ,Y(i,:)
是1x2单元格,第一个元素是i
中的X{1}
字符串,其第二个元素是i
- X{2}
中的双重字符。即Y(i,:)
与定义如下的1x2单元Yi
xi1 = X(i, 1);
xi2 = X(i, 2);
Yi = {xi1{1} xi2{1}};
(抱歉尴尬!我无法直接用Yi
和X
找到i
的 MATLAB表达式,而无需创建中间变量xi1
和xi2
。)
答案 0 :(得分:2)
首先,据我所知,在Matlab中没有'惯用'的方法。请记住,我们正在谈论具有嵌套单元格和不同类型的复杂数据结构。
我试图根据cellfun制作一个解决方案。它很快变得复杂,我甚至没有成功。所以我建议做一个简单的双循环for a和if if this:
for a=1:size(X,2),
for b=1:size(X{a},1),
if iscell(X{a}),
Y{a,b} = X{a}{b};
else
Y{a,b} = X{a}(b);
end
end
end
如果X = {{'s1';'s2'} [3; 4]}
,此解决方案将提供Y = {'s1' 3 ;'s2' 4}
。
如你所见,我将细胞扁平化到一个深度。要获取1xN
向量,请执行Y{1,:}
希望有所帮助
答案 1 :(得分:1)
如果X中的每个单元格都包含相同大小的矢量,将其转换为矩阵,则转置该矩阵,然后将其转换回单元格数组?
tmp = cell2mat(X);
Y = mat2cell(tmp', ...);
答案 2 :(得分:1)
这是功能:
feval(@(y) feval(@(x) cellfun(@(varargin)[varargin],x{:},'un',0), cellfun(@(x) feval(@(varargin) varargin{3-varargin{1}}(), iscell(x),x,num2cell(x)),y,'un',0)), {{'1','2','3'},[4 5 6],{7,8,9}})
或存储为函数名称:
transpose_nest = @(cell_nest) feval(@(y) feval(@(x) cellfun(@(varargin)[varargin],x{:},'un',0), cellfun(@(x) feval(@(varargin) varargin{3-varargin{1}}(),iscell(x),x,num2cell(x)),y,'un',0)), cell_nest);
transpose_nest({{'1','2','3'},[4 5 6],{7,8,9}})
{{'1',4,7},{'2',5,8},{'3',6,9}}
它基于Matlab等效的Scheme(应用地图列表'((“1”“2”“3”)(4 5 6)(7 8 9)))仅适用于子单元格:
feval(@(x) cellfun(@(varargin)[varargin],x{:},'un',0), {{'1','2','3'},{4,5,6},{7,8,9}})
{{'1',4,7},{'2',5,8},{'3',6,9}}
额外部分:
@(x) feval(@(varargin) varargin{3-varargin{1}}(), iscell(x), x, num2cell(x))
是匿名函数中的if语句,如果任何子元素是向量
,则调用num2cell