Построить структуру Octave по строкам

Я имею в виду использовать структуру для хранения таблицы:

% Sample data
% idx  idxstr  var1  var2  var3
%   1    i01    3.5  21.0   5
%  12    i12    6.5   1.0   3

Первая строка содержит имена полей. Я мог бы вводить эти данные по столбцам напрямую,

ds2 = struct( ...
    'idx', { 1, 12 }, ...
    'idxstr', { 'i01', 'i12' }, ...
    'var1', { 3.5, 6.5 }, ...
    'var2', { 21, 1 }, ...
    'var3', { 5, 3 } ...
);

и косвенно по строкам, создавая массив ячеек и преобразовывая в структуру,

ds3 = cell2struct( ...
  { 1, 'i01', 3.5, 21.0, 5; ...
    12, 'i12', 6.5, 1.0, 3 ...
  }, { 'idx', 'idxstr', 'var1', 'var2', 'var3' }, 2 );

Есть ли прямой способ ввода данных по строкам?

Кроме того, почему разные размеры?

>> size(ds2), size(ds3)
ans =

   1   2

ans =

   2   1

person sancho.s ReinstateMonicaCellio    schedule 03.12.2020    source источник
comment
просто сделай ds3 = cell2struct( ... { 1, 'i01', 3.5, 21.0, 5; ... 12, 'i12', 6.5, 1.0, 3 ... }, { 'idx', 'idxstr', 'var1', 'var2', 'var3' }, 2 )';   -  person Ander Biguri    schedule 03.12.2020
comment
@AnderBiguri - я не понимаю разницы между вашим предложением и тем, что я опубликовал.   -  person sancho.s ReinstateMonicaCellio    schedule 03.12.2020
comment
последний апостроф делает размер ds3 таким же, как ds2. на самом деле не очень важно.   -  person Ander Biguri    schedule 03.12.2020
comment
Могу я спросить, почему вы предпочитаете создавать массивы структур? Для меня это функционально эквивалентно массиву таблиц, содержащих одну строку, а не одной таблице с несколькими строками. Я вижу, как это было бы очень громоздко работать с...   -  person Tasos Papastylianou    schedule 04.12.2020
comment
@TasosPapastylianou - у меня нет особых предпочтений. Я просто сделал это таким образом, и я, безусловно, открыт для других вариантов, если они выгодны.   -  person sancho.s ReinstateMonicaCellio    schedule 04.12.2020


Ответы (1)


Как я уже упоминал в вашем другом сообщении здесь, вам, вероятно, лучше создать свою "таблицу" как структуру полей массива, а не массив однострочных структур.

Однако ради написания полезного ответа я предполагаю, что причина, по которой вы выбрали эту форму для начала, может заключаться в том, что у вас уже есть данные в виде строк в форме «ячейки» (например, возможно, результат операции csv2cell), и вы хотели бы преобразовать его в такую ​​таблицу.

Следовательно, чтобы создать красивую таблицу как структуру массивов из такой структуры данных, вы можете следовать следующей стратегии:

Data = { 1, 'i01', 3.5, 21.0, 5;   12, 'i12', 6.5, 1.0, 3 };
d1 = struct( 'idx'   ,  [Data{:,1}] ,
             'idxstr', {{Data{:,2}}},   % note the 'enclosing' braces!
             'var1'  ,  [Data{:,3}] ,
             'var2'  ,  [Data{:,4}] ,
             'var3'  ,  [Data{:,5}]
           );

или, используя cell2struct, если вы предпочитаете такой синтаксис:

d2 = cell2struct( { [Data{:,1}],
                    {Data{:,2}},   % note the lack of enclosing braces here!
                    [Data{:,3}],
                    [Data{:,4}],
                    [Data{:,5}] },
                  { 'idx', 'idxstr', 'var1', 'var2', 'var3' },
                  2
                );

Обратите внимание, что вам нужно знать, представляет ли «столбец» числовой или строковый массив, чтобы вы обернули его в [] или {} соответственно... но я думаю, что знание типа данных, представленного каждым столбцом, не является необоснованным Требование от программиста.

person Tasos Papastylianou    schedule 04.12.2020