从命令行启动matlab后,在linux终端中丢失了一些东西

pQB*_*pQB 5 linux bash matlab

从linux中的命令行启动matlab时,我有一种奇怪的行为.

我在linux中有一个bash脚本,它从命令行在matlab中执行一个函数,并使用C++编写的自定义函数执行其他操作,如下所示:

#!/bin/bash
# prepare input data just to be sure it has not been written by other test!
matlab2011a -nodesktop -nosplash -r "prepare_data_matlab( 'A' ); quit"
# launch C++ program
...
# prepare more data
matlab2011a -nodesktop -nosplash -r "prepare_data_matlab( 'B' ); quit"
Run Code Online (Sandbox Code Playgroud)

当脚本完成后,虽然命令有效,但我看不到我在终端写的内容.我需要到reset终端.

事实上,如果我只使用matlab启动matlab,一切正常,prepare_data_matlab( 'A' )但是当我执行带有选项的函数时问题就出现了prepare_data_matlab( 'B' ).

我逐行评论,发现问题是B调用函数的选项

dlmwrite(file_name, B, ' ');
Run Code Online (Sandbox Code Playgroud)

不用于prepare_data_matlab( 'A' ).

那么,我应该如何从命令行执行matlab以避免这种行为?该dlmwrite()功能是否存在已知错误?

我正在使用Ubuntu 12.04 64位,GNU bash,versión4.2.24 (1)-release(x86_64-pc-linux-gnu)和matlab2011a.

编辑:生成的输出prepare_data_matlab( 'A' )是 在此输入图像描述

生成的输出prepare_data_matlab( 'B' )是 在此输入图像描述

编辑: file_name创建为strcat(path_to_data,f);where path_to_data = /tmp/和f = data_out.txt.Matrix B之前或之后不显示.

从bash脚本生成MATLAB脚本之前或之后到终端的唯一输出如下:

echo "#### SELECT DATA FROM WORKSPACE ####"
matlab2011a -nodesktop -nosplash -r "prepare_data_matlab( 'B' ); quit";
echo "#### Process Data as input in a C++ programs ####"
Run Code Online (Sandbox Code Playgroud)

MATLAB函数从workscape中选择数据并将其保存到磁盘,如下所示:

function [ ] = prepare_data_matlab( type )
if strcmp(type,'A')
    % load data from workscape
    load ('workspace_with_my_arrays.mat', 'A');    
    % save data as a standalone variable
    save('/tmp/A.mat', 'A');
elseif strcmp(type,'B')
    % load data from workscape
    load ('workspace_with_my_arrays.mat', 'B');    
    path_to_data = '/tmp/';
    f            = 'data_out.txt';
    file_name    = strcat(path_to_data,f);
    % save data as a txt file
    dlmwrite(file_name, B, ' ');
end
end
Run Code Online (Sandbox Code Playgroud)

编辑: whos -file workspace_with_my_arrays.mat

Name                             Size                     Bytes  Class     Attributes

A                             610x340x103            170897600  double              
B                             610x340x103            170897600  double
P                             610x340                  1659200  double              
t1                            38855x100                 31084000  double              
t2                            3921x2x100                6273600  double
Run Code Online (Sandbox Code Playgroud)

工作区中有更多的数组,但是我加载了这些数组.

该prepare_data_matlab函数与上面发布的相同,但参数错误检查如下:

%% Load data from file 
% Data is saved in a MATLAB variable or in TXT 
if nargin ~= 1
    error('Use: prepare_data_matlab( [ A | B ] )')
end
Run Code Online (Sandbox Code Playgroud)

和以下命令:

cd /data/matlab;
Run Code Online (Sandbox Code Playgroud)

在两种情况下(参数A和选项B),即在if语句之前,在参数错误检查之后执行.

cab*_*bad 5

问题不在于dlmwrite.这似乎是某些版本的MATLAB中的错误,如此链接中所述.

建议的解决方案(如果你有一个错误的MATLAB版本)是使用nohup:

nohup matlab -nodesktop -nosplash -r ...........
Run Code Online (Sandbox Code Playgroud)

更新: 根据@Amro的建议,@ pQB向MathWorks支持报告了这个问题.他们的回应是:

问题是R2012a之前的版本中的已知问题.在不同的shell下运行MATLAB.例如,tcsh或zsh都没有此问题.

旧答案: 问题不在于dlmwrite,而在于矩阵的内容.此外,除非file_name指向stdout(例如file_name='/dev/stdout';),否则该dlmwrite功能不会向屏幕写入任何内容,也不会弄乱您的终端.无论是file_name点stdout或正在显示之前(或之后)的矩阵B正确dlmwrite调用.

在任何情况下,问题都在于矩阵B的内容(请参阅输出中的奇怪字符).您需要解决矩阵B的问题.也许您用来读取其输入数据的方法有问题.

  • @Amro来自MathWork支持:问题是R2012a之前版本中的已知问题.在不同的shell下运行MATLAB.例如,tcsh或zsh都没有此问题. (2认同)