2012-04-08 170 views
1

我認爲這可能是一個語法問題,這裏是代碼。尺寸不匹配MatLab;不知道爲什麼它不匹配

load ([ 'C:\Users\Abid\Desktop\Inquiry Runs\dtS' ]) 
dtS((dtS==0))=nan; 
for j=2:9; 
maxS=max(dtS(j,:)); 
minS=min(dtS(j,:)); 

maxval(j,:)=dtS((dtS>(maxS-.1*maxS))); 
minval(j,:)=dtS((dtS<(minS+.1*minS))); 

avmax(j)=mean(maxval(j,:)); 
avmin(j)=mean(minval(j,:)); 

avs(j,:)=[avmax(j) avmin(j)] 
end 

所以我知道行矩陣每個循環都是不同的大小。例如,maxval(j,:)將根據其正在查看某一值的某一行進行更改。

我手動這樣做也得知在第一循環中的矩陣是大小(1,1),但是,如果我回路設置爲僅J = 2運行時,行的長度是13。

通常,如果矩陣在循環中改變大小,我只會得到一個警告,但這次我認爲這是由於我不明白的原因。

回答

1

你說得對,問題是maxval(j,:)是不同的大小。 length(maxval(j, :))不是length(dtS((dtS>(maxS-.1*maxS))));這會導致問題,因爲maxval必須是'矩形',但是如果它被這行代碼擴展,它的一些值將不會被定義。試想一下:

x = [1, 2; 3, 4]; 
x(3, :) = [5, 6, 7]; 

如果此代碼是合法的,其結果必然是:

x: [1, 2, ?; 
    3, 4, ?; 
    5, 6, 7] 

因爲這些不確定的值,並且,MATLAB不會讓你這樣做。你可以使用一個單元陣列來代替:

maxval = cell(9, 1); 
avmax = zeros(9, 1); 
avs = zeros(9, 2); 
for j=2:9; 
    maxS=max(dtS(j,:)); 
    minS=min(dtS(j,:)); 

    maxval{j} = dtS((dtS>(maxS-.1*maxS))); 
    minval{j} = dtS((dtS<(minS+.1*minS))); 

    avmax(j)=mean(maxval{j}); 
    avmin(j)=mean(minval{j}); 

    avs(j,:)=[avmax(j) avmin(j)] 
end 
+0

哇這個很棒,我認爲解決方案是類似的,但我不太瞭解matlab如何讀取不同「類型」數組的差異。 – Abid 2012-04-08 06:54:55