Как мне учесть пропущенные данные при создании файла Excel в MATLAB? - PullRequest
1 голос
/ 18 ноября 2009

Я опубликовал аналогичный вопрос, связанный с построением данных , и теперь мне хотелось бы узнать, как обрабатывать недостающие данные при выводе данных в файл Excel с использованием функции XLSWRITE .

У меня есть два набора данных различной длины (описано в вопросе, на который я ссылаюсь выше). Я пытаюсь заменить файл меньшего размера нулями для случаев, когда данные отсутствуют. Вот код, который я пытался использовать:

newfile2 = zeros(144,20);
[ts,ifile1,ifile2] = intersect(file1(:,1),file2(:,1));
newdfile2(ifile2,:) = file2;

Здесь я уже преобразовал данные столбца 1 в число, используя DATENUM . Так что ifile2 дает мне индексы времени, которые являются общими для обоих файлов. Проблема в том, что я получаю эту ошибку для строки 3:

((??? Subscripted assignment dimension mismatch. ))

Это потому, что размер file2 равен 130 на 20 , а мой file1 имеет размер 144 на 20 . Я также попробовал другой подход, используя ISMEMBER , чтобы найти отсутствующие индексы, и все еще получил ту же ошибку.

Может кто-нибудь дать мне какое-нибудь руководство?

Ответы [ 2 ]

2 голосов
/ 18 ноября 2009

Одним из решений, которое позволит вам выводить «пустые» ячейки на рабочий лист Excel, является преобразование данных в массив ячеек с пустыми значениями или пробелами вместо нулей, используя один из следующих параметров:

newData = cell(size(fileData1));  %# Each cell is initialized to []
[newData{:}] = deal('');          %# Change the cell contents to an empty string
[newData{:}] = deal(' ');         %# Change the cell contents to a blank

Тогда есть два способа продолжить. Если отметки времени в меньшем файле являются только подмножеством отметок времени в большем файле (т. Е. В меньшем файле никогда не бывает отметки времени, которая не равна в большем), то вы можете просто используйте функцию ISMEMBER следующим образом:

t = fileData1(:,1);                      %# Time-stamps from file 1
index = ismember(t,fileData2(:,1));      %# Find index of common time-stamps
newData(:,1) = num2cell(t);              %# Copy time-stamps
newData(index,:) = num2cell(fileData2);  %# Copy file 2 data

Однако, если - это метки времени в меньшем файле, которые не находятся в большем, вы должны вместо этого сделать следующее, используя функцию INTERSECT :

t = fileData1(:,1);                                  %# Time-stamps from file 1
[junk,index1,index2] = intersect(t,fileData2(:,1));  %# Find indices
newData(:,1) = num2cell(t);                          %# Copy time-stamps
newData(index1,:) = num2cell(fileData2(index2,:));   %# Copy file 2 data

Выше будут отброшены все метки времени, которые находятся в меньшем файле, но не в большем. Если вы хотите включить эти дополнительные данные, включите следующий дополнительный код (который использует функции SETDIFF и SORT ):

[junk,index] = setdiff(fileData2(:,1),t);           %# Unique time-stamp indices
newData = [newData; num2cell(fileData2(index,:))];  %# Add unique data
[junk,index] = sort([newData{:,1}]);                %# Sort the time-stamps
newData = newData(index,:);                         %# Reorder the data

Теперь, если вы используете XLSWRITE для вывода newData в файл Excel, ячейки заполнения должны отображаться как пустые, хотя в документации по XLSWRITE есть следующие замечания:

Полная функциональность xlswrite зависит по использованию Microsoft Excel COM сервер. Типичная установка Excel для Windows включает доступ к этот сервер. Если ваша система не установить Excel для Windows или если COM-сервер недоступен, xlswrite

  • Записывает матрицу M в виде текстового файла в Формат значения с разделителями-запятыми (CSV).

  • Игнорирует аргументы листа и диапазона.

  • Генерирует ошибку, если входная матрица M - это массив ячеек.

Если в вашей системе установлен Microsoft Office 2003 программное обеспечение установлено, но вы хотите создать файл в Excel 2007 формат, вы должны установить офис Пакет совместимости 2007 года.

1 голос
/ 18 ноября 2009

Если я правильно понимаю ваш вопрос, вы хотите скопировать файл из file2 в newfile2 и скопировать данные с временными метками, которые существуют в file1, и вы хотите, чтобы newfile2 был того же размера, что и file1.

newfile2 = zeros(size(file1));
[ts,ifile1,ifile2] = intersect(file1(:,1),file2(:,1));
newfile2(ifile1,:) = file2(ifile2,:);

должен сделать трюк.

...