2012-10-18 68 views
0

我將如何能夠做到這相當於用繩子:將字符串添加到循環,字符串(matlab)的等價物?

a = [1 2 3; 4 5 6]; 
c = []; 
for i=1:5 
b = a(1,:)+i; 
c = [c;b]; 
end 

c = 

2  3  4 
3  4  5 
4  5  6 
5  6  7 
6  7  8 

基本上找幾個字符串合併成一個矩陣。

+0

一般性評論:類似上面描述的循環效率非常低,因爲隨着每次迭代'c'都在增長。通過用'c = zeros(5,3)'替換'c = []'來預分配'c',然後相應地調整行'c = [c; b];'。或者更好的是,完全用'bsxfun(@plus,(1:5)',a(1,:))'省略循環。 –

回答

1

你的意思是在每個矩陣位置上存儲一個字符串?你不能這樣做,因爲矩陣是基於基本類型定義的。您可以在每個位置上的CHAR:

>> a = 'bla'; 
>> b = [a; a] 

b <2x3 char> = 

bla 
bla 

>> b(2,3) = 'e' 

b = 

bla 
ble 

如果你想存儲矩陣,使用電池陣列(MATLAB referenceBlog of Loren Shure),這是相似,但使用「{}」,而不是「( )「:

>> c = {a; a} 

c = 

    'bla' 
    'bla' 

>> c{2} 

ans = 

bla 
+0

感謝您的回答!你的例子可以在FOR循環中使用嗎?例如。 a ='bla';對於i = 7 c(i)= [c; a];結束 – Jake

+0

好的,Rody的回答很好地解釋了這一點。還有關於預分配的說明。最後一個(不相關的)事物:注意他避免使用「i」作爲變量名,因爲如果你這樣做,你隱藏了常量sqrt(-1)的值 - 複數 - 。同樣適用於「j」 – dunadar

3

你在一個循環,這是在Matlab一種罪惡的增長變量:)所以我要告訴你做陣列級聯的一些更好的方法。

有電池串:

>> C = { 
    'In a cell string, it' 
    'doesn''t matter' 
    'if the strings' 
    'are not of equal lenght'}; 

>> C{2} 
ans = 
    doesn't matter 

,你可以在一個循環中使用,像這樣:

% NOTE: always pre-allocate everything before a loop 
C = cell(5,1); 

for ii = 1:5 
    % assign some random characters 
    C{ii} = char('0'+round(rand(1+round(rand*10),1)*('z'-'0'))); 
end 

有普通陣列,其中有一個缺點,你必須知道所有的大小您的字符串預先:

a = [... 
    'testy'  % works 
    'droop' 
]; 

b = [... 
    'testing'    % ERROR: CAT arguments dimensions 
    'if this works too' % are not consistent. 
    ]; 

對於這些情況下,使用char

>> b = char(... 
     'testing',... 
     'if this works too'... 
    ); 
b = 
    'testing   ' 
    'if this works too' 

char焊盤在第一串用空格如何以配合第二字符串的長度。現在再次:不要在循環中使用它,除非您預先分配了數組,或者如果真的沒有其他方法可行的話。

在Matlab命令提示符下鍵入help strfun以獲得Matlab中可用的所有字符串相關函數的概述。

+0

感謝分享Rody。我只是喜歡閱讀矢量化的東西... – Abhinav