【问题标题】:Octave select a file?八度选择一个文件?
【发布时间】:2025-12-26 10:00:16
【问题描述】:

Octave 有让用户选择输入文件的好方法吗?我在 Matlab 中看到过这样的代码,但在 Octave 中不起作用。

首选基于 gui 的方法,但也可以使用某种命令行选择。如果有某种方法可以在 Matlab 和 Octave 中工作,那就太好了。

我为 Matlab 找到了this,但它在 Octave 中不起作用,即使您为 listdlg 函数安装了Octave Forge Java 包。在 Octave 中,dir() 为您提供:

  647x1 struct array containing the fields:

    name
    date
    bytes
    isdir
    datenum
    statinfo

但我不知道如何将其转换为 listdlg 期望的字符串数组。

【问题讨论】:

  • “好”就像在基于 GUI 的方法中一样?

标签: file openfiledialog octave


【解决方案1】:

您已经安装了Octave Forge java package,因此您可以创建任何 java 类的实例并调用任何 java 方法。

例如创建JFileChooser并调用JFileChooser.showOpenDialog(Component parent)方法:

frame = javaObject("javax.swing.JFrame");
frame.setBounds(0,0,100,100);
frame.setVisible(true);
fc = javaObject ("javax.swing.JFileChooser")
returnVal = fc.showOpenDialog(frame);
file = fc.getSelectedFile();
file.getName()

顺便说一句。我在安装软件包时遇到了一些麻烦。 这是 Ubuntu 的fix。这也适用于我的 Debian 测试。

编辑

@NoBugs 回复您的评论:

如果您需要使用 listdlg,您可以执行以下操作:

d = dir;
str = {d.name};
[sel,ok] = listdlg('PromptString','Select a file:',...
                'SelectionMode','single',...
                'ListString',str);
if ok == 1
    disp(str{sel(1)});
end

这应该与matlab兼容,因为我现在无法测试它。

如果要选择多个文件,请使用:

d = dir;
str = {d.name};
[sel,ok] = listdlg('PromptString','Select a file:',...
                'SelectionMode','multiple',...
                'ListString',str);
if ok == 1
   imax = length(sel);
   for i=1:1:imax
      disp(str{sel(i)});
   end
end

【讨论】:

  • 很棒的代码!即使没有那个修复,它对我来说也能正常工作,使用 Ubuntu 并编译 Octave 3.4.2。但是,我正在寻找与链接的 Matlab 代码等效的代码,要求用户使用 listdlg 在当前目录中选择一个文件。兼容性或与 Matlab 的最小差异将是一大优势。
【解决方案2】:

我从来没有遇到过 octave 中的打开文件对话框。
如果您正在寻找基于 gui 的方法,guioctave 可能会为您提供帮助。我从来没有用过它,因为它似乎只适用于 windows 机器。

一个可能的解决方案是用 octave 编写一个小脚本,这将允许用户解析目录并选择这样的文件。

【讨论】:

  • Matlab 可以使用 Listdlg 提示输入文件:mathworks.com/help/techdoc/ref/listdlg.html,如果您安装 Octaveforge Java 包,Octave 也有 Listdlg。但是,我无法让它使用 Matlab 示例代码提示输入文件。
【解决方案3】:

我想我会为这个旧问题提供一个更新的答案,因为它出现在其他问题的“相关问题”字段中。

Octave 提供了 uigetdiruigetfile 函数,可以满足您的期望。

【讨论】: