2012-08-10 37 views
7

phép giả sử tôi có các mảng sau:tìm giá trị NaN là tế bào mảng

a = {1; 'abc'; NaN} 

Bây giờ tôi muốn tìm hiểu, trong đó chỉ số này chứa NaN, vì vậy mà tôi có thể thay thế chúng với '' (chuỗi rỗng) .

Nếu tôi sử dụng cellfun với isnan tôi nhận được một kết quả vô ích

cellfun(@isnan, a, 'UniformOutput', false) 

ans = 
[   0] 
[1x3 logical] 
[   1] 

Vậy làm thế nào tôi sẽ làm đúng điều này?

Trả lời

11

Thật vậy, khi bạn tìm thấy chính mình, điều này có thể được thực hiện bằng

a(cellfun(@(x) any(isnan(x)),a)) = {''} 

Bảng phân tích:

Fx = @(x) any(isnan(x)) 

sẽ trả lại một vô hướng vô hướng hợp lý, bất kể là x là vô hướng hay vectơ. Sử dụng chức năng này bên cellfun sau đó sẽ erradicate nhu cầu 'UniformOutput', false:

>> inds = cellfun(Fx,a) 
inds = 
    0 
    0 
    1 

Đây có thể được sử dụng như là chỉ số cho mảng ban đầu:

>> a(inds) 
ans = 
    [NaN] 

do đó cho phép chuyển nhượng với những chỉ số:

>> a(inds) = {''} 
a = 
    [1] 
    'abc' 
    '' 

Lưu ý rằng nhiệm vụ phải được thực hiện cho chính một mảng ô. Nếu bạn không hiểu điều này, hãy đọc về sự khác biệt giữa a(inds)a{inds}.

+0

Nếu 'x' là một ma trận, bạn cần phải thay đổi các chức năng ẩn danh để' @ (x) bất kỳ (bất kỳ (isnan (x))) '(tức là thêm' bất kỳ' cho lần thứ hai, để đảm bảo bạn có được vô hướng từ hàm này)). –

+1

@ peci1: bạn nói đúng. Trên thực tế, nói chung, tốt nhất là nên làm 'bất kỳ (isnan (x (:))', hoạt động cho các mảng của bất kỳ thứ nguyên nào và chỉ gọi 'bất kỳ' một lần. –

2
  • a(ind) = [] sẽ loại bỏ các mục từ mảng
  • a(ind)= {''} sẽ thay thế NaN với một chuỗi rỗng.

Nếu bạn muốn xóa mục nhập sử dụng = [] thay vì = {''}.
Nếu bạn muốn thay thế NaN s với một giá trị khác chỉ cần đặt nó tương đương với giá trị sử dụng dấu ngoặc nhọn:

a(ind) = {value} 
Các vấn đề liên quan