2012-02-07 567 views
0

我非常感謝這方面的幫助。MATLAB - 在for循環中從系統命令的輸出構建矩陣

我正在嘗試以下操作。

在for循環中,運行2個系統命令,並讓這兩個命令的輸出組成循環每次迭代的矩陣的一行的所有三個元素。然後我想將整個矩陣打印到一個excel文件中。

我嘗試這樣做:

for i=1:3, 
    command1 = ['fslmeants -i image1 -m example_' num2str(i) '.nii.gz' ] 
    C(i,1) = evalc('system([command1])') 
    command2 = ['fslstats example_' num2str(i) ' -V'] 
    C(i,2:3) = evalc('system ([command2])') 
end 

我收到以下錯誤消息:

???分配有更多的非單RHS尺寸大於非單標

錯誤==> name_of_script在8 C(I,1)= EVALC( '系統([命令1])')

我然後試圖此

for i=1:3, 
    command1 = ['fslmeants -i image1 -m example_' num2str(i) '.nii.gz' ] 
    A = evalc('system([command1])') 
    command2 = ['fslstats example_' num2str(i) ' -V'] 
    B = evalc('system ([command2)') 
end 

輸出系統([命令1])的時候,不嘗試將矩陣元素分配給它是

A = 

0.302714 

ans = 

0 

對於系統的輸出([命令2])時,我不不要嘗試分配矩陣元素t ·其是

B = 

1413 19506.814453 

ans = 

0 

如果我然後鍵入B(1,2),我得到

ans = 

4 

這使我在B中的第一數目的第二位,而不是所述第二數量(19506.814453)作爲我想了。

我然後檢查是否B爲一個字符數組如下:

ischar B 

ans = 

    1 

所以我想如果我能找到爲MATLAB識別系統的輸出([命令1])和系統的方式([命令2 ])作爲for循環的每次迭代的同一行的3個元素,我將被排序。

那麼理想,矩陣C的第一行會

C(1,:) = [ 0.302714 1413 19506.814453 ] 

和一個額外的行會與循環的每次迭代中添加。

任何人都可以啓發失落的靈魂嗎?

+0

'ischar B'等同於'ischar('B')',因此即使您沒有這樣的變量,您也會獨立於變量B的內容而獲得1。而不是'ischar(B)'。 – yuk 2012-02-07 18:36:05

回答

1

爲了得到一個命令的輸出,你應該使用系統的第二輸出:

[~,output]=system('....'); 

要變換字符串轉換爲數字或基質,使用功能str2num

str2num('123') 
ans = 
    123 

str2num('1 2 3') 
ans = 
    [ 1  2  3 ] 
+0

非常感謝,讓它工作。非常感激。 – 2012-02-07 19:21:43

0

你爲什麼不只是收集system調用的輸出,而無需使用evalc

[status, A] = system(command1); 
[status, B] = system(command2); 

如果輸出是空間分隔的數字,您可以使用正則表達式與拆分選項的字符串:

Bnum = str2double(regexp(B,' ','split')); 

您可以爲做同樣的(在command1可以返回多個號碼),或只是字符串轉換爲數字:

Anum = str2double(A); 

然後將它們合併到一個單一的載體:

C(1,:) = [A, B]; 

請確保儘管這兩個命令總是返回相同數量的值。

+0

非常感謝,讓它工作。非常感激。 – 2012-02-07 19:21:32