2013-01-08 67 views
2

我有一个1×Ñ细胞,称之为X,其分量X{i}(对于i在{1,2,...,Ñ})是字符串的任 中号 X1细胞或 M x1数字向量。如何转置Mx1细胞和载体的细胞?

注:X包含文本单元和数字载体的事实将不让使用cell2mat这里:

>> tmp = cell2mat(X); 
Error using cell2mat (line 46) 
All contents of the input cell array must be of the same data type. 

我的问题是:

什么是MATLAB的“地道”的方式转本数据转换成数组M 1x N cells?

编辑:要清楚,数据结构,我想在到达时,我们称之为Y,为1&#x0078的中号 - 长数组; N细胞(每个细胞由数字和字符串的混合物组成)。例如,如果Ñ= 2,并且如果X{1}中号x串的1个小区,并且X{2}中号x双打1个向量,则期望的数据结构Y是这样的,对于任何1 ≤ i中号Y(i,:)是1×2的细胞,其第一元件是在所述X{1}i串并且其第二元件处于所述X{2}i双。即Y(i,:)将是相同的1x2细胞Yi定义如下

xi1 = X(i, 1); 
xi2 = X(i, 2); 
Yi = {xi1{1} xi2{1}}; 

(对不起,我尴尬!我只是不能直接在条款Xi找到一个MATLAB表达式Yi,而无需创建中间变量xi1xi2。)

+0

你是什么意思“转成M的数组1xN细胞“?以现在存储的方式处理这些数据有什么问题?你问如何访问1xN单元阵列中的每个元素? –

+0

我想将数据传递给函数,这些函数使用1xN单元格的数组作为参数。 – kjo

+0

将Mx1矩阵的单元阵列转换为单个矩阵很容易,只需执行[X {:}]'。但是,在字符串的情况下,您希望获得什么数据结构? –

回答

2

首先,据我所知,没有“惯用”的方式做我的Matlab。请记住,我们正在讨论嵌套单元格和不同类型的复杂数据结构。

我试图制作一个基于cellfun的解决方案。它很快变得复杂,我甚至没有成功。所以,我建议您做的for循环和一个简单的双,如果是这样的:

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

如果X中的每个单元格包含相同大小的向量将其转换为矩阵,请将该矩阵转置并将其转换回单元格数组?

tmp = cell2mat(X); 
Y = mat2cell(tmp', ...); 
+0

谢谢,但那不行;我在原始文章中添加了一条注释,说明原因。 – kjo

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的等效方案(应用地图列表'((“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)) 

是调用num2cell一个匿名函数中的if语句,如果任何子元素是一个向量