从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语句之前,在参数错误检查之后执行.
问题不在于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的问题.也许您用来读取其输入数据的方法有问题.