2012-04-08 269 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