2013-11-26 42 views
0

我正在嘗試編寫一個函數來分類一個數字向量。下標中的分配維度不匹配for looop

function [a]=classify(x) 
i=length(x); 
for j=1:1:i 
    if(x(j)<0.5) 
     a(j,j,:)='low'; 
    elseif(x(j)==0.5) 
     a(j,1,:)='medium'; 
    else 
     a(j,1,:)='high'; 
    end 
end 

當我嘗試代碼時,出現下標賦值維度不匹配錯誤。

classify([0.5 0.1]) 
Subscripted assignment dimension mismatch. 

Error in classify (line 5) 
a(j,1,:)='low'; 

是由於我的矩陣大小的錯誤?我已經通過其他解決方案,但他們似乎沒有工作。

+0

假設'a(j,j,:)='low'中的第二個'j';'是一個錯字? – chappjc

+0

雅,第二個j是一個錯字,對不起有關 – kenny

回答

2

第一次通過你的功能,j = 1,所以在你的輸入向量中的值,你最終分配:

a(j,1,:)='medium'; 

您可以檢查:

>>size(a) 
ans = 
    1  1  6 

下一次通過你的循環你有j = 2,然後分配:

a(j,j,:)='low'; 

但是這會導致錯誤,因爲數組需要沿着數組的第三維分配新的字符串長度= 6('medium'長度),因爲這是您用來初始化數組的值。

您的數組將此視爲不兼容的賦值,並給出錯誤。

爲了解決這個問題,你需要使用類似Cell數組的東西,它可以容納可變的數據大小和類型。

所以,你的代碼需要看起來像這樣(注意,從(的變化),以{}爲數組):

function [a]=classify(x) 
i=length(x); 
for j=1:1:i 
    if(x(j)<0.5) 
     a{j,j,:}='low'; 
    elseif(x(j)==0.5) 
     a{j,1,:}='medium'; 
    else 
     a{j,1,:}='high'; 
    end 
end 

例如,您的數據執行此修改函數給出:

classify([0.5 0.1]) 

ans = 

    'medium'  [] 
      [] 'low' 

我不知道這是否可以在您的應用程序的其餘部分正常工作,但至少可以爲您提供正確的數據結構。

最後的評論,我不明白爲什麼你有你的陣列中的3個維度,你爲什麼不只是使用:

function [a]=classify(x) 
i=length(x); 
for j=1:1:i 
    if(x(j)<0.5) 
     a{j,:}='low'; 
    elseif(x(j)==0.5) 
     a{j,:}='medium'; 
    else 
     a{j,:}='high'; 
    end 
end 

給予輸出(任意輸入向量):

classify([rand(1,6)])' 

ans = 

    'high' 'low' 'high' 'low' 'low' 'low' 
+0

嗨roybatty,感謝您的幫助,我不是很確定什麼是(j,:)做的,當我看到問題時,他們有這個1 j,1,:)在其中,所以我想我已經試過了,你對2維版本的建議正是我所需要的。你介意解釋()和{}之間的區別嗎? – kenny

+0

使用()來定義數組值告訴Matlab您使用的是標準數組類型。當你使用{}索引一個變量時,這告訴Matlab你正在使用一個Cell數組。單元陣列非常靈活,可以適應不同的數據類型和不同的數組維數,正如你從上面的例子中看到的那樣。查看Matlab幫助以獲得更多討論和示例。 –

+0

嗨,感謝您的解釋=)對不起,我剛剛忽略了它,接受了你的回答。謝謝您的幫助! – kenny