2011-02-04 37 views
7

Tôi có một ma trận ALàm cách nào để thay thế một số giá trị cột tùy thuộc vào điều kiện?

A= 
    4.0000 120.0000 92.0000   0   0 37.6000 0.1910 30.0000 
    10.0000 168.0000 74.0000   0   0 38.0000 0.5370 34.0000 
    10.0000 139.0000 80.0000   0   0 27.1000 1.4410 57.0000 
    1.0000 139.0000 60.0000 23.0000 846.0000 30.1000 0.3980 59.0000 
    5.0000 136.0000 72.0000 19.0000 175.0000 25.8000 0.5870 51.0000 
    7.0000 121.0000   0   0   0 30.0000 0.4840 32.0000 

Tôi muốn làm hai việc:

  1. Thay thế các giá trị của cột đầu tiên mà là lớn hơn 5 bằng 0.
  2. Trong giây cột, nếu các giá trị nằm trong khoảng 121-130, thay thế chúng bằng 0. Nếu chúng nằm trong khoảng 131-140, thay thế bằng 1, 141-150 x 2, 151-160 x 3, v.v.

Vì vậy, ma trận kết quả mong muốn sẽ là:

A= 
    4.0000 0.0000 92.0000   0   0 37.6000 0.1910 30.0000 
    0.0000 4.0000 74.0000   0   0 38.0000 0.5370 34.0000 
    0.0000 1.0000 80.0000   0   0 27.1000 1.4410 57.0000 
    1.0000 1.0000 60.0000 23.0000 846.0000 30.1000 0.3980 59.0000 
    5.0000 1.0000 72.0000 19.0000 175.0000 25.8000 0.5870 51.0000 
    0.0000 0.0000   0   0   0 30.0000 0.4840 32.0000 

Làm cách nào để thực hiện điều này?

Tôi đã cố gắng một cái gì đó như thế này:

counter=1; 
for i = 1: rows 
    if A(i,1) > 5 
     A(i ,1) = 0; 
    end 
    if A(i,2) > 120 && A(i,2) < 130 
     A(i ,2) = 0; 
    end 
    counter = counter+1; 
end 

Sẽ sử dụng một trường hợp làm các việc lừa?

+0

Còn giá trị cạnh như 130 thì sao? Đó có phải là 0 hoặc 1 không? – gnovice

+0

cũng quên nói, một cạnh sẽ là 0, 131-140 sẽ là 1, 141-150 2 – cMinor

Trả lời

11

Bạn có thể thay đổi 2 cột đầu tiên của A như vậy:

A(A(:,1) > 5,1) = 0;    %# Set values in column 1 greater than 5 to 0 
A(:,2) = fix((A(:,2)-121)./10); %# If the values in column 2 are all 120 or 
           %# greater you can shift, scale, then round 
           %# them towards 0 to get the new values 

Trên đây sử dụng matrix indexingvectorized operations để tránh cho vòng hoặc báo cáo trường hợp.

+0

Làm thế nào mà làm việc, bạn có thể giải thích, Sửa chữa vòng số ... nhưng? – cMinor

+2

+1 để sử dụng thông minh FIX. Nếu các phạm vi không cách nhau bằng nhau như trên, có thể bạn sẽ sử dụng HISTC – Amro

+1

@darkcminor: Hàm [FIX] (http://www.mathworks.com/help/techdoc/ref/fix.html) tương đương với [FLOOR ] (http://www.mathworks.com/help/techdoc/ref/floor.html) cho số dương và [CEIL] (http://www.mathworks.com/help/techdoc/ref/ceil.html) cho số âm, vì vậy mọi thứ được làm tròn về 0. Nếu bạn muốn có ý tưởng tốt hơn về những gì được thực hiện cho từng phần tử của cột thứ hai khi bạn trừ 121 và chia cho 10, hãy xem những gì bạn nhận được trước khi áp dụng FIX: '(A (:, 2) -121) ./ 10' – gnovice

Các vấn đề liên quan