2013-07-31 99 views
5

從Linux中的命令行啓動MATLAB時,我有一個怪異的行爲啓動MATLAB後,在linux終端東西。缺少命令行

我在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" 

當腳本完成我不能看看我在終端寫什麼,雖然這些命令有效果。我需要reset這個終端。

事實是,一切工作正常,如果我只與prepare_data_matlab('A')啓動matlab,但問題出現時,我用選項prepare_data_matlab('B')執行該功能。

我已經一行註釋行,發現問題與選項B調用未在prepare_data_matlab('A')使用的功能

dlmwrite(file_name, B, ' '); 

所以,我應該怎麼通過命令行執行MATLAB來避免這種行爲?是否有dlmwrite()函數的已知錯誤?

我使用Ubuntu的12.04 64位,GNU bash的,版本4.2.24(1)-release(x86_64的-PC-Linux的GNU)和matlab2011a

EDITED:prepare_data_matlab('A')產生的輸出是 enter image description here

prepare_data_matlab('B')產生的輸出是 enter image description here

EDITED:file_name作爲strcat(path_to_data,f);其中path_to_data = /tmp/f = data_out.txt創建。矩陣B不顯示之前或之後。

的唯一輸出到終端之前或從bash腳本生成如下的MATLAB腳本之後:從所述Workscape公司

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

MATLAB函數選擇數據並將其保存到磁盤如下:

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 

編輯:衛生組織-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聲明之前。

+4

(通過'>'殼重定向)輸出重定向到一個文件,並讓我們知道什麼是產生輸出破壞了終端。 – mnagel

+0

@mnagel我已經用matlab命令生成的輸出更新了問題。我沒有注意到這些奇怪的人物,我不知道他們的意思。 – pQB

+0

「##### SELECT DATA FROM WORKSPACE ####」'消息是否正確顯示在屏幕上? – cabad

回答

5

的問題不在於dlmwrite。這似乎是某些版本的MATLAB中的一個錯誤,如在link中報告的。

提出的解決方案(如果你有MATLAB的越野車版本)是使用nohup

nohup matlab -nodesktop -nosplash -r ........... 

UPDATE: 每@Amro的建議,@pQB報告的問題,以支持The MathWorks公司。他們的迴應是:

問題是R2012a之前版本中的已知問題。在不同的shell下運行MATLAB。例如,tcsh或zsh都沒有這個問題。

OLD答案: 的問題不在於dlmwrite,但與矩陣的內容。此外,除非file_namestdout(例如,file_name='/dev/stdout';),該dlmwrite功能將不寫入任何屏幕,不會亂你的終端。 file_name指向stdout,或者您正在dlmwrite調用之前(或之後)顯示矩陣B.

在任何情況下,問題是與你的矩陣B的內容(參見在輸出的奇怪的字符)。你需要用你的矩陣B解決這個問題。也許你用來讀取輸入數據的方法是錯誤的。

+0

數據是從MATLAB工程圖中讀取的。在'dlmwrite'調用之前或之後,沒有輸出從MATLAB函數寫入終端。我用這個信息更新了這個問題。 – pQB

+0

我改變了我的答案,因爲我做了一些搜索,發現這是MATLAB中的一個錯誤。因此,您無法修復它,但您可以按照我的新答案中的建議解決它。 – cabad

+0

你說得對。你的建議解決了這個問題。如此多的錯誤檢查... – pQB

1

如果你想忽略從MATLAB輸出(如在開始打印橫幅),啓動過程和兩個標準輸入和錯誤重定向到/dev/null設備:

#!/bin/sh 

echo '### running MATLAB ###' 
matlab -nodesktop -nosplash -r "..." > /dev/null 2>&1 
echo '### done ###' 

./other_script.sh 

matlab -nodesktop -nosplash -r "..." > /dev/null 2>&1 

請注意,您應該謹慎因爲MATLAB過程可能會在完成運行之前立即返回,如果您的下一個程序依賴於MATLAB生成的文件,可能會導致問題。有關可能的解決方案,請參閱here

+0

我嘗試將輸出重定向到/ dev/null,並且不打印任何內容,也不打印橫幅。但是,問題依然存在。當腳本結束時,我看不到我在Linux控制檯中輸入的內容。 – pQB

+0

如果你不打印任何東西從MATLAB到標準輸出,那麼可能是你的C++程序損壞了終端? – Amro

+0

我不這麼認爲。我從linux bash終端執行'matlab2011a -nodesktop -nosplash -r「prepare_data_matlab('B'); quit」;',如果我在prepare_data函數中註釋了'dlmwrite'調用,問題就會消失。 – pQB