我將如何能夠做到這相當於用繩子:將字符串添加到循環,字符串(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
基本上找幾個字符串合併成一個矩陣。
我將如何能夠做到這相當於用繩子:將字符串添加到循環,字符串(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
基本上找幾個字符串合併成一個矩陣。
你的意思是在每個矩陣位置上存儲一個字符串?你不能這樣做,因爲矩陣是基於基本類型定義的。您可以在每個位置上的CHAR:
>> a = 'bla';
>> b = [a; a]
b <2x3 char> =
bla
bla
>> b(2,3) = 'e'
b =
bla
ble
如果你想存儲矩陣,使用電池陣列(MATLAB reference,Blog of Loren Shure),這是種相似,但使用「{}」,而不是「( )「:
>> c = {a; a}
c =
'bla'
'bla'
>> c{2}
ans =
bla
你在一個循環,這是在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中可用的所有字符串相關函數的概述。
感謝分享Rody。我只是喜歡閱讀矢量化的東西... – Abhinav
一般性評論:類似上面描述的循環效率非常低,因爲隨着每次迭代'c'都在增長。通過用'c = zeros(5,3)'替換'c = []'來預分配'c',然後相應地調整行'c = [c; b];'。或者更好的是,完全用'bsxfun(@plus,(1:5)',a(1,:))'省略循環。 –