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