Прочитать таблицу с 2 значениями на ячейку в виде матрицы (n, j, 2) - PullRequest
0 голосов
/ 09 мая 2019

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

2,2    2,0
0,2    1,1

как матрица 2,2,2

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

1 Ответ

1 голос
/ 09 мая 2019

Если данные в электронной таблице содержат одно число на ячейку, просто импортируйте данные в двумерный массив. Команда 'reshape' может изменить размерность массива, но иногда бывает немного сложно изменить порядок расположения элементов так, как вы хотите. Этот код возьмет двумерный вектор M размера Rx (2C) и превратит его в трехмерный блок данных размером [R C 2], чередующийся по страницам в строках оригинала. По вашим номерам трудно сказать, что это работает, поэтому я использовал другой набор, который легче отслеживать.

    M = [1 2 3 4
        5 6 7 8];
    M = reshape(M,[size(M,1) 2 size(M,2)/2]);
    M = permute(M,[1 3 2])

Что приводит к:

    M(:,:,1) =
         1     3
         5     7
    M(:,:,2) =
         2     4
         6     8

Если данные в электронной таблице имеют два значения на ячейку, разделенные запятой (как предлагается в комментариях), они будут импортированы в MATLAB как серия массивов ячеек. Рассмотрим электронную таблицу с 4 ячейками (2x2) со следующими данными:

[  1,2  ][  3,4  ]
[  5,6  ][  7,8  ]

В MATLAB мы можем загрузить это, используя

    [~,TXT]=xlsread('filename.xlsx');

И переменная TXT будет:

    TXT =
      2×2 cell array
        {'1,2'}    {'3,4' }
        {'5,6'}    {'7,8'}

Операция на клетках - это боль. Я не могу придумать способ сделать это без циклов «for», но как только вы это сделаете, назначить третье измерение будет легко.

    M = zeros([size(TXT,1) size(TXT,2) 2]);
    for ii = 1:size(TXT,1)
        for jj = 1:size(TXT,2)
            temp = sscanf(char(TXT(ii,jj)),'%f,%f');
            M(ii,jj,:) = reshape(temp,[1 1 2]);
        end
    end

Для значений выше

    M(:,:,1) =
         1     3
         5     7
    M(:,:,2) =
         2     4
         6     8
...