编辑:事实证明此问题未解决,因为 无法处理空单元格 源数据。即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的控制台输出非常不一致。
答案 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>