【问题标题】:Import matrix definition from Excel into MATLAB将矩阵定义从 Excel 导入 MATLAB
【发布时间】:2017-07-01 08:18:06
【问题描述】:

我有一个 Excel 工作表,其中包含结构的定义,包括我想导入 MATLAB 的内容。例如,两个 Excel 单元格中的定义可能如下所示,并保存为串联字符串:

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。实际上,我有多达数千个字符串将从 Excel 中的 VBA 宏生成。

【问题讨论】:

  • 你能上传一张 Excel 表格的图片,以便更好地了解它的外观吗?
  • @Cebri 我复制和粘贴的范围与我一开始提到的完全一样。在一个特定的列中有很多结构定义(实际上是数千个)。事实上,所有结构字段名称及其内容都将根据我可以在不同单元格中执行的设置在 Excel 中创建。
  • 好吧,我想我现在明白了。所以一个单元格包含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,其字段和值在 Excel 工作表的每个单元格中定义。这是正确的吗?
  • 没错,关键是结构的字段名称及其内容将在 Excel 中创建。现在,我使用字符串连接创建了它们,并将一个特定字段的完整 MATLAB 兼容定义保存在一个特定的 Excel 单元格中。我现在想知道我的复制和粘贴方式是否是将这些定义返回 MATLAB 的最有效方式?

标签: excel matlab import


【解决方案1】:

我创建了如图所示的 Excel 工作簿,将其命名为 Book1.xlsx 并将其保存在我的工作目录中。

然后我创建了以下 MATLAB 脚本,该脚本使用 xlsread 读取第一张工作表 (Sheet1) 的整个 A 列,然后使用 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 的字符串? 有什么不好的,就是这样。

【讨论】:

  • 哇,您的解决方案正在运行,它节省了我一些时间,因为我不必从 Excel 复制和粘贴。我会看一下那个文件,但我认为我可以处理这个风险。非常感谢。
【解决方案2】:

您可以使用readtableimportdata

xlsreaduiimport 也可能有效,请参阅此链接以获取 available options

【讨论】:

  • 所有这些函数的问题是我需要指定一个变量名称,我将值从 Excel 分配到。在我的例子中,结构的名称及其对应的字段将在 Excel 中定义,我需要将这些名称带回 MATLAB。现在,我正在复制范围 B2:B2000 并将内容粘贴到 MATLAB 代码中。 Excel单元格包含MATLAB代码直接理解的结构定义。
  • @Andi : Mkay... 所以我看到了 2 个选项,要么将 Excel 范围加载到 MATLAB 数组中并修改代码,要么可以直接从 VBA 生成 MATLAB 代码到 txt 文件或其他格式,如果它更适合。我不确定哪一个是最好的,因为我不知道你的代码! ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2014-11-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
相关资源
最近更新 更多