从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"
当脚本完成后,虽然命令有效,但我看不到我在终端写的内容.我需要重置终端.
事实是,如果我只使用prepare_data_matlab(‘A’)启动matlab,一切正常,但是当我使用选项prepare_data_matlab(‘B’)执行函数时问题就出现了.
我逐行评论,发现问题是选项B调用函数
dlmwrite(file_name, B, ' ');
在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);其中path_to_data = / tmp /和f = data_out.txt.矩阵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 ####"
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
编辑: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
工作区中有更多的数组,但是我加载了这些数组.
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
和以下命令:
cd /data/matlab;
在两种情况下(参数A和选项B),即在if语句之前,在参数错误检查之后执行.
解决方法:
问题不在于dlmwrite.这似乎是某些版本的MATLAB中的一个错误,如此link中所述.
建议的解决方案(如果你有一个错误的MATLAB版本)是使用nohup:
nohup matlab -nodesktop -nosplash -r ...........
更新:
根据@Amro的建议,@ pQB向MathWorks支持部门报告了这个问题.他们的回应是:
The problem is a known issue in versions prior to R2012a. Run MATLAB under a different shell. For example, neither tcsh or zsh have this issue.
老答案:
问题不在于dlmwrite,而在于矩阵的内容.此外,除非file_name指向stdout(例如,file_name =’/ dev / stdout’;),否则dlmwrite函数不会向屏幕写入任何内容,也不会弄乱终端. file_name指向stdout,或者您正在dlmwrite调用之前(或之后)显示矩阵B.
在任何情况下,问题都在于矩阵B的内容(请参阅输出中的奇怪字符).您需要解决矩阵B的问题.也许您用来读取其输入数据的方法有问题.
原文地址:https://codeday.me/bug/20190517/1121818.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。