2015-04-17 48 views
0
for i=1:30 
    Name(i,1)=sprintf('String_%i',i); 
end 

錯誤,我只是困惑究竟是不是在這裏工作,這個腳本看起來很簡單,wnat打造一個字符串列表,從1編號到30.收到錯誤下標分配維度不匹配。在MATLAB

下標的轉讓尺寸不匹配。

+1

嘗試用單元格數組來代替它,它的工作原理如下:'Name {i,1} = ...'。您不能將字符串存儲到常規數值數組中。您也可以使用'sprintfc'作爲單行:'Name = sprintfc('String_%i',1:30)''。 –

回答

5

Matlab沒有字符串,它們有char數組。就像幾乎所有的編程語言一樣,在不知道要分配多少內存的情況下,Matlab不能定義變量。在Java解決方案是這樣的:

String str[] = {"I","am","a","string"}; 

到c類似++解決方案:

std::string str[] = {"I","am","another","string"}; 

的C解決方案看起來不同,但一般是相同的解決方案在C++:

const char* str[] = {"I","am","a","c-type","string"}; 

然而,儘管表面上看起來都基本相同,但他們都知道要分配多少數據,即使它們不會啓動。特別是可以例如寫:

String str[3]; 
// Initialize element with an any length string. 

其原因是存儲在各元件中的存儲器是由它的在Java引用,並通過在C和C++的指針存儲。因此,根據操作系統的不同,每個元素可能是4(32位)或8(64位)字節。

但是,在Matlab矩陣中,數據是按值存儲的。這使得不可能將N字符數組存儲在1xNNx1矩陣中。矩陣中的每個元素只允許與char相同的大小,並且類型爲char。這意味着,如果您使用字符串,則需要使用數據結構cell(也由Benoit_11建議),該數據結構存儲對每個元素中的任何Matlab對象的引用。

k = 1:30; 
Name = cell(length(k),1); 
for i=k 
    Name{i,1}=sprintf('String_%i',i); 
end 

希望解釋對你有意義。我認爲,根據你的嘗試,你至少有一些編程經驗,至少來自除matlab以外的其他語言。

+0

很好的解釋!我想你在循環中缺少花括號;否則會出現錯誤。即或者使用'Name {i,1} = ...'或'... = {sprintf(...)}'。 –

+1

@ Benoit_11對不起,關於這個,我編輯了答案 – patrik