2015-12-02 2 views
5

я пытаюсь векторизациями следующего вложенного цикла, так что я не должен построить значения в цикле:Vectorize вложенный для цикла, и если оператор

for i=1:size(validMaskX,1) 
    for j=1:size(validMaskX,2) 
     if(validMaskX(i,j)) 
     plot(ah, [dataX(i,j) dataX(i,j+1)], [dataY(i,j) dataY(i,j+1)], 'g-')    
     end 
    end 
end 
  • размера (validMaskX) = 45x44
  • размер (Datax) = размер (dataY) = 45х45

Любые предложения о том, как это сделать?

+0

Не тестировался, но 'Vind = найти (validMaskX); vindn = vind + size (validMaskX, 1); plot (ah, [dataX (vind), dataX (vindn)], [dataY (vind), dataY (vindn)]); 'work? Это предполагает, что 'validMaskX' и' dataX' и 'dataY' имеют одинаковое количество строк. – zeeMonkeez

+0

Вы хотите, чтобы все линии на одной оси? Поскольку ваш код отображает одну строку за раз, вам понадобится цикл на временной интервал. – Adiel

ответ

2

С

vind=find(validMaskX); 
vindn = vind + size(validMaskX, 1); 

вы можете найти действительные точки и вторые индексы. Затем, вы можете построить с

plot(ah, [dataX(vind), dataX(vindn)], [dataY(vind), dataY(vindn)], 'g-'); 

Если вы хотите только один объект участок (который будет делать рендеринг гораздо быстрее), рассмотрим

dx = [dataX(vind), dataX(vindn), nan(numel(vind), 1)]'; 
dy = [dataY(vind), dataY(vindn), nan(numel(vind), 1)]'; 
plot(ah, dx(:), dy(:), 'g-'); 
+0

Это ТОЧНО, что мне нужно! Благодаря! –

+0

По крайней мере, вы изменили имена переменных ... :) – Adiel

+0

Эй, я разместил это как комментарий перед вами! – zeeMonkeez

1

Если вы хотите, чтобы все линии вместе на рисунке, вы можете сделать это:

ind=find(validMask); 
X=[dataX(ind) dataX(ind+45) nan(length(ind),1)]; 
Y=[dataY(ind) dataY(ind+45) nan(length(ind),1)]; 
plot(ah,X',Y','g-') 
0

Я думал, что вчера я понял ваше решение, но, видимо, я не» t, потому что, когда я пытаюсь изменить следующий код в соответствии с вашим ответом, он не работает: как бы вы изменили это в соответствии с вашим прежним ответом?

for i=1:size(validMaskY,1) 
    for j=1:size(validMaskY,2) 
     if(validMaskY(i,j)) 
     plot(ah, [dataX(i,j) dataX(i+1,j)], [dataY(i,j) dataY(i+1,j)], 'r-') 
     end 
    end 
end 

размер (DataX) = размер (dataY)

+0

Попробуйте изменить эту строку: 'vindn = vind + 1;' – Adiel

+0

Извините, что did'nt sovle моя проблема ... –

+0

A. 'size (validMaskY, 1)' равно 45, поэтому, когда 'i = 45' вы можете не получить 'dataX (i + 1, j)', это превысит размеры матрицы. B. Это будет очень полезно, если вы сможете объяснить, в чем именно проблема. Мы не можем догадаться, что такое «ваша проблема», и почему это не решило. – Adiel

Смежные вопросы