4

次のコードを「ベクトル化」する方法を探しています。つまり、時間がかかっている for ループを取り除きたいのです (この for ループは、40,000 回以上繰り返す別の for ループにネストされています)。

for k=1:length
    if coords(k,1)<=4 && coords(k,2) <=8
        upperLeft(countUL,:) = coords(k,:);
        countUL=countUL+1;
    end
    if coords(k,1)>4 && coords(k,2) <=8
        upperRight(countUR,:) = coords(k,:);
        countUR=countUR+1;
    end
    if coords(k,1)>4 && coords(k,2) >8
        lowerRight(countLR,:) = coords(k,:);
        countLR=countLR+1;
    end
    if coords(k,1)<=4 && coords(k,2) >8
        lowerLeft(countLL,:) = coords(k,:);
        countLL=countLL+1;
    end
end

最初は Matlabfind関数 (例: find(coords(k,1)<=4)) を使用しようとしましたが、私の場合、「見つける」必要がある 2 つのパラメーターがあります。のようなものを試しましfind(coords(:,1)<=4 && coords(:,2)<=8)たが、 のオペランドが&&スカラーではないため、これは機能しません。これを行う方法についてのアイデアは大歓迎です!

4

1 に答える 1

7

&&お気づきのように、スカラー比較に対してのみ機能し||ます。ただし、ベクトルで作業します&|あなたも必要ないことに注意してくださいfind

idxUL = coords(:,1) <= 4 & coords(:,2) <=8;
idxUR = coords(:,1) > 4 & coords(:,2) <=8;

upperLeft = coords(idxUL,:);
upperRight = coords(idxUR,:); %# etc
于 2012-10-09T12:06:50.663 に答える