2

我有一个 1x N单元格,称为它X,其组件X{i}(对于i{1, 2, ..., 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.

我的问题是:

MATLAB 将这些数据转换为M 1x N单元数组的“惯用”方式是什么?

编辑:要清楚,我想要到达的数据结构,我们称之为它Y,是一个M长的 1x N单元格数组(每个单元格由数字和字符串的混合组成)。例如,如果N = 2,并且如果X{1}M x1 字符串单元,并且X{2}M x1 双精度向量,则所需的数据结构Y是这样的,对于任何 1 ≤ iMY(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和表示的 MATLAB 表达式i,而不必创建中间变量xi1xi2。)

4

3 回答 3

2

首先,据我所知,在 Matlab 中没有“惯用”的方式来做到这一点。请记住,我们谈论的是具有嵌套单元格和不同类型的复杂数据结构。

我试图根据 cellfun 编写一个解决方案。它很快变得复杂,我什至没有成功。因此,我建议做一个简单的 double for 循环和一个 if,如下所示:

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,:}

希望能帮助到你

于 2013-01-08T20:43:16.840 回答
1

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

tmp = cell2mat(X);
Y = mat2cell(tmp', ...);
于 2013-01-08T18:21:54.827 回答
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}}

它基于仅适用于子单元格的 Scheme 的 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))

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

于 2013-07-11T20:23:37.337 回答