无法使用 string/numeric 混合数据填充元胞数组

Cannot fill cell array with mixed string/numeric data

我试图用混合的数字和字符串数据填充一个空元胞数组,以便随后写入 Excel,但遇到了问题。以下 MCVE 应该重现该问题:

首先,我创建元胞数组并将左上角的元素设置为空字符串。到目前为止一切顺利:

xls_array = cell(7,6);
xls_array{1,1} = '';

然后我需要用它们各自的 headers 填充数组的第一行和第一列。这些是在代码的其他地方创建的变量(元胞数组),但出于 MCVE 的目的,我创建了一些人工变量:

col_headers = {'Channel 1';'Channel 2';'Channel 3';'Channel 4';'Channel 5'};
xls_array(1,2:end) = col_headers';
row_headers = {'Var A';'Var B';'Var C';'Var D';'Var E';'Var F'};
xls_array(2:end,1) = row_headers;

到目前为止,还不错。现在我需要将实际数据添加到元胞数组中,这就是问题所在。同样,出于 MCVE 的目的,我生成了一些随机数据:

data = rand(6,5);
xls_array{2:end,2:end} = data;

这给了我以下错误信息:

>> xls_array{2:end,2:end} = data;
error: invalid dot name structure assignment because the structure array is empty.  Specify a subscript on the structure array to resolve.

如果我尝试使用普通括号而不是大括号,它不会出错,但也不会给我预期的结果:

xls_array(2:end,2:end) = data;
>> xls_array{2,2}
ans =

   0.326180   0.169640   0.381373   0.416490   0.283456
   0.350000   0.366084   0.409047   0.619715   0.962095
   0.526219   0.466591   0.553932   0.930187   0.460585
   0.983679   0.324129   0.964619   0.080852   0.786360
   0.069995   0.835966   0.266789   0.673177   0.796602
   0.741368   0.233794   0.022568   0.012975   0.248514

即它已将整个数值数组 data 复制到元胞数组 xls_array(2:end,2:end) 的每个元素中。

我想要的是将 data 复制到单元格数组的剩余空白单元格中,即 data(1,1) 应该在 xls_array{2,2}data(1,2)xls_array{2,3}, 等等...

我也尝试了以下方法,但无济于事:

>> xls_array{2:end,2:end}(:) = data;
error: a cs-list cannot be further indexed

有人可以帮忙吗?

您需要将数值数组转换为元胞数组并使用括号进行索引:

xls_array(2:end,2:end) = num2cell(data);

花括号可以这样使用:

[xls_array{2:end,2:end}] = num2cell(data){:};

或者,您可以使用串联运算符创建结果:

xls_array = [{''}, col_headers.'; row_headers, num2cell(data)];

为什么其他方法不起作用?

大括号用于特殊类型的索引,其中 returns 元胞数组的 内容 作为 逗号分隔列表。如果 LHS 是一个逗号分隔的列表,那么 RHS 也应该是一个逗号分隔的列表,其元素的数量不小于 LHS 的数量,并且应该在 LHS 周围使用方括号。有关逗号分隔列表的更多信息,请参见 documentation。所以 xls_array{2:end,2:end} = data; 是错误的,因为 data 可以解释为只包含一个元素的逗号分隔列表,但 LHS 需要更多元素并且缺少方括号。

示例xls_array(2:end,2:end) = data; 我认为是 Octave 中的一个错误,因为元胞数组是其元素类型为 cell 的数组。当括号用于正常的单元格索引赋值时,赋值的右侧应该是 cell 类型,并且没有从其他类型到单元格类型的隐式转换。所以xls_array(2:end,2:end) = data;应该是错误的,因为data是double类型的。然而,我们可以看到 Octave 的行为是 data 被隐式转换为单元格 {data},然后分配给 LHS 的元素。