Невозможно заполнить массив ячеек смешанными строковыми/числовыми данными

Я пытаюсь заполнить пустой массив ячеек смешанными числовыми и строковыми данными для последующей записи в Excel и столкнулся с проблемой. Следующий MCVE должен воспроизвести проблему:

Во-первых, я создаю массив ячеек и устанавливаю верхний левый элемент в пустую строку. Все идет нормально:

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

Затем мне нужно заполнить первую строку и первый столбец массива соответствующими заголовками. Это переменные (массивы ячеек), созданные в другом месте кода, но для целей 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

Кто-нибудь может помочь?


person am304    schedule 28.08.2019    source источник
comment
PS: я знаю, что мог бы использовать цикл for и проходить каждый элемент data по одному, но наверняка должен быть более элегантный/эффективный способ?   -  person am304    schedule 28.08.2019


Ответы (1)


Вам нужно преобразовать числовой массив в массив ячеек и использовать круглые скобки для индексации:

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

Фигурные скобки можно использовать следующим образом:

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

В качестве альтернативы вы можете использовать оператор конкатенации для создания результата:

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

Почему другие методы не работают?

Фигурные скобки используются для особого типа индексации, который возвращает содержимое массива ячеек в виде списка, разделенного запятыми . Если LHS представляет собой список, разделенный запятыми, то RHS также должен быть списком, разделенным запятыми, число элементов в котором не меньше, чем в LHS, а вокруг LHS должны использоваться квадратные скобки. Дополнительные сведения о списках, разделенных запятыми, можно найти в документации. Таким образом, xls_array{2:end,2:end} = data; неверно, потому что data можно интерпретировать как список, разделенный запятыми, содержащий только один элемент, но LHS требует больше элементов, а также отсутствуют квадратные скобки.

Пример xls_array(2:end,2:end) = data; я думаю, что это ошибка в Octave, потому что массив ячеек - это массив, тип его элементов - ячейка. Когда круглые скобки используются для нормального индексированного назначения ячеек, правая часть назначения должна иметь тип cell, и нет неявного преобразования из других типов в тип ячейки. Таким образом, xls_array(2:end,2:end) = data; должно быть неправильным, потому что data имеет тип double. Однако мы можем видеть, что поведение Octave заключается в том, что data неявно преобразуется в ячейку {data}, а затем присваивается элементам LHS.

person rahnema1    schedule 28.08.2019
comment
Спасибо, я сам пришел почти к такому же выводу и использовал xls_array(2:end,2:end) = mat2cell(data,ones(1,5),ones(1,4));, который тоже сработал. - person am304; 29.08.2019