将单元矩阵的元素嵌入矩阵

时间:2016-10-20 17:40:03

标签: matlab matrix console cell

编辑:事实证明此问题未解决,因为 无法处理空单元格 源数据。即k = {1 2 [] 4 5}; cat( 2, k{:} )代表1 2 4 5而非1 2 NaN 4 5。因此,后续reshape现在未对齐。任何人都可以概述处理此问题的策略吗?

我有以下表格的数据:

X = {  ...
       { '014-03-01' [1.1] [1.2] [1.3] }; ...
       { '014-03-02' [2.1] [2.2] [2.3] }; ...  %etc
    }

我希望将[1.1]替换为1.1等,并使用datenum

将整数替换为整数

所以我也可以使用标准的2D矩阵来保存结果(因为每个元素都可以表示为Double)。

但是如何重新包装?

我希望使用X{:,1} = datenum( X{:,1} )就地切换日期,但此命令失败。

我能做到:

A = cat( 1, X{:} )

dateNums = datenum(  cat( 1, A{:,1} )  )
values = reshape(  cat( 1, A{:,2:end} ),  size(X,1),  []  )

final = [dateNums values]

嗯,这很有效,但我对此感到不舒服。

>> u = A{:,1}
u =
    014-03-01
>> cat(1,u)
ans =
    014-03-01

这表明只输出一个值。但是:

>> cat(1,A{:,1})
ans =
    014-03-01
    014-03-02

因此A{:,1}必须发出连续的值流,而cat必须接受varargs。

所以现在如果我做A{:,2:end},它现在再次将2D子网格作为连续的值流... ...获得该网格的唯一方法是cat - > reshape它。这是正确的理解吗?

我发现MATLAB的控制台输出非常不一致。

2 个答案:

答案 0 :(得分:3)

"顺序的值流"被称为comma-separated list。在控制台中在MATLAB中执行A{:,1}等同于以下语法:

>> A{1,1}, A{2,1}, A{3,1}, ..., A{end,1}

这就是为什么你看到一个值流的原因,因为它实际上键入了第一列的单元格的每一行,用逗号分隔并在命令提示符中显示。当您将它们解压缩到以逗号分隔的列表中时,这可能是您的激怒的来源,因为您正在获取单元格中所有内容的详细转储。无论如何,这就是您使用cat的原因,因为执行cat(1, A{:,1})等同于:

cat(1, A{1,1}, A{2,1}, A{3,1}, ... A{end,1})

最终结果是它获取第一列的2D单元数组中的所有元素,并创建一个新结果,将所有这些元素连接在一起。同样,执行A{:, 2:end}等同于(注意列主要顺序):

>> A{1, 2}, A{2, 2}, A{3, 2}, ..., A{end, 2}, A{1, 3}, A{2, 3}, A{3, 3}..., A{end, 3}, ..., A{end, end}

这就是你需要执行reshape的原因,因为如果你自己做了cat,那么它只会给你一个向量。您可能需要2D矩阵,因此需要reshape将矢量转换为矩阵形式。

如果您熟悉Python,以逗号分隔的列表与Python splat operator非常相似。 splat运算符用于解压缩放在单个列表或迭代器类型中的输入参数...例如,如果在Python中有以下内容:

l = [1, 2, 3, 4]
func(*l)

这相当于:

func(1, 2, 3, 4)

以上并不是理解逗号分隔列表的必要条件,但我只想告诉您它们已经在许多编程语言中使用,包括Python。

答案 1 :(得分:1)

空单元格存在问题:cat会跳过它们。这意味着后续的reshape会导致“维度不匹配”。错误。

以下代码只是删除包含空单元格的行(这是我需要的)作为预处理步骤。

(用NaN s替换空单元只需要做一点改动。

A = cat( 1, X{:} );

% Remove any row containing empty cells
emptiesInRow = sum( cellfun('isempty',A), 2 );
A( emptiesInRow > 0, : ) = [];

% Date is first col
dateNums = datenum(  cat( 1, A{:,1} )  );

% Get other cols
values = reshape(  cat( 1, A{:,2:end} ),  size(A,1),  []  );

% Recombine into (double) array
grid = [dateNums values];  %#ok<NASGU>