如何转置Mx1细胞和载体的细胞?

时间:2013-01-08 16:32:10

标签: matlab

我有一个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}};

(抱歉尴尬!我无法直接用YiX找到i MATLAB表达式,而无需创建中间变量xi1xi2。)

3 个答案:

答案 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