MATLAB: извлечение данных из структуры и размещение в матрице нестандартного размера - PullRequest
1 голос
/ 23 марта 2012

У меня есть файл filedata.mat, содержащий структуру 1x1 с подуровнями, которые содержат данные из каналов транспортных средств. файл имеет около 30 измеренных каналов. Имена каналов, единицы измерения и значения каналов (в зависимости от времени) хранятся на отдельных подуровнях.

Я хочу указать, какие каналы (то есть, какие столбцы данных) по номеру столбца, и иметь код, чтобы поместить данные в матрицу с именами каналов в строке 1 и единицами канала в строке 2.

Код, который у меня сейчас есть, находится ниже:

clear all;

channels = [1 4 8];

source = load('filedata.mat');

N = size(channels,2);
I = size(source.Data.DataOut,1) + 2;
data = zeros(I,N);

for i = (1:1:I)
    for n = (1:1:N)
        if i == 1
           data(i,n) = source.Data.ChannelNames{channels(n)};
        elseif i == 2
           data(i,n) = source.Data.ChannelUnits{channels(n)};
        else
           data(i,n) = source.Data.DataOut{i,channels(n)};
        end
    end
end

Я думаю, что это поместит имена каналов в строку 1 (т.е. когда i = 1), каналы в строке 2 (когда i = 2), а затем разместит все оставшиеся строки данных до i = I.

Однако, когда я запускаю этот код, я получаю сообщение об ошибке «Несоответствие размера подписанного назначения». в строке 14:

 data(i,n) = source.Data.ChannelNames{channels(n)};

Если кто-то может предложить решение и - возможно, что еще более важно - объяснить, где я ошибся (чтобы я мог чему-то научиться!), Я был бы очень признателен.

Заранее спасибо.

1 Ответ

0 голосов
/ 23 марта 2012

Я предполагаю, что ChannelNames - это массив ячеек строк. Таким образом, оператор source.Data.ChannelNames{channels(n)} возвращает строку, которую нельзя присвоить числовому значению в data.

Если вы хотите выбрать имена каналов и сохранить их в переменной, сделайте эту переменную массивом ячеек. Тогда

data = cell(I,N);
data(1,:) = source.Data.ChannelNames(channels);
data(2,:) = source.Data.ChannelUnits(channels);
data(3:I,:) = num2cell(source.Data.DataOut(:,channels));
...