2017-02-13 13 views
2

У меня есть лист Excel, содержащий определения структуры, включая ее содержимое, которое я хотел бы импортировать в MATLAB. Например, определение в двух ячейках Excel может выглядеть и сохраняется в виде каскадного строки:Импортировать определение матрицы из Excel в MATLAB

testCase.expectedSolution.long = [1,2,3 ; 4,5,6 ; 7,8,9]; 
testCase.expectedSolution.short = [10,11,12 ; 13,14,15 ; 16,17,18]; 

Я использую эти определения, как ожидается, решения для модульных тестов в среде MATLAB. Прямо сейчас, я просто делаю копию & вставки из Excel в код MATLAB, чтобы определить структуру в MATLAB. Тем не менее, мне интересно, можно ли (и подходящим) импортировать эти строки в MATLAB. В действительности у меня есть до тысячи строк, которые будут сгенерированы из макроса VBA в Excel.

+0

Можете ли вы загрузить изображение листа Excel, чтобы лучше понять, как оно выглядит? – codeaviator

+0

@Cebri Диапазон, который я копирую и вставляю, выглядит так, как я упоминал в первую очередь. В одном столбце есть много определений структуры (фактически тысяч). На самом деле все имена полей структуры, а также ее содержимое будут созданы в Excel на основе настроек, которые я могу выполнять в разных ячейках. – Andi

+0

Хорошо, думаю, теперь я понимаю. Таким образом, одна ячейка содержит 'testCase.expectedSolution.long = [1,2,3; 4,5,6; 7,8,9]; ', ячейка под ней содержит' testCase.expectedSolution.short = [10,11,12; 13,14,15; 16,17,18], и т. Д. И вы хотите создать ['struct'] (https://mathworks.com/help/matlab/ref/struct.html), чьи поля и значения определены в каждой из ячеек вашего листа Excel. Это верно? – codeaviator

ответ

1

Я создал книгу Excel, показанную на изображении, назвал ее Book1.xlsx и сохранил ее в моем рабочем каталоге.

Excel workbook

Затем я создал следующий MATLAB скрипт, который использует xlsread, чтобы прочитать всю колонку с первым листом (Лист1), а затем использует eval выполнить строку, содержащуюся в каждой клетке, как если бы вы иметь напечатал каждую команду вручную в окне команд:

filename = 'Book1.xlsx'; 
sheet = 1; 
xlRange = 'A:A'; 

[~, txt, ~] = xlsread(filename, sheet, xlRange); 

for i = 1:size(txt, 1) 
    eval(txt{i}); 
end 

Это выход:

>> testCase.expectedSolution 
ans = 
    long: [3x3 double] 
    short: [3x3 double] 

Будьте осторожны с eval, потому что:

Многие распространенные виды использования функции eval являются менее эффективными и более трудно читать и отлаживать, чем другие функции MATLAB и языка конструктов. Для получения дополнительной информации см. Alternatives to the eval Function.

Я настоятельно рекомендую вам прочитать TUTORIAL: Why Variables Should Not Be Named Dynamically (eval), чтобы вы поняли последствия использования eval.

Цитирование Sam Robert's answer:

eval даже риск безопасности - то, что происходит, если пользователь вводит в строке, где выбранные персонажи system(''rm -r /''); a? Что-то плохое, вот что.

+0

Вау, ваше решение работает, и это сэкономит мне время, потому что мне не нужно копировать и вставлять из Excel. Я посмотрю на этот документ, но думаю, что я могу справиться с этим риском. Большое спасибо. – Andi

0

Вы можете использовать readtable или importdata.

xlsread или uiimport также может работать, см. Эту ссылку для available options.

+0

Проблема со всей этой функцией заключается в том, что мне нужно указать имя переменной, которое я присваиваю значениям из Excel. В моем случае имя структуры и соответствующие ей поля будут определены в Excel, и мне нужно вернуть эти имена в MATLAB. Прямо сейчас, я копирую, скажем, диапазон B2: B2000 и вставляя содержимое в код MATLAB. Ячейки Excel содержат определения структур. Код MATLAB напрямую понимает. – Andi

+0

@ Andi: Mkay ... Итак, я вижу 2 варианта: либо вы загружаете диапазон Excel в массив MATLAB, либо изменяете свой код, либо можете сгенерировать свой код MATLAB непосредственно из VBA в txt-файл или другой формат, если он лучше подходит , Я не уверен, какой из них будет лучшим, поскольку я не знаю вашего кода! ;) – R3uK