2010-08-03 35 views
34

Làm thế nào để phát hiện các ô trống trong một mảng ô? Tôi biết lệnh để xóa ô trống là a(1) = [], nhưng tôi dường như không thể nhận được MATLAB để tự động phát hiện ô nào trống.Làm thế nào để phát hiện các ô trống trong một mảng ô?

Bối cảnh: Tôi đã phân bổ một mảng ô bằng cách sử dụng a=cell(1,53). Sau đó, tôi sử dụng if exist(filename(i)) và textcan để kiểm tra tệp và đọc nó. Kết quả là khi filename(i) không tồn tại, kết quả ô trống và chúng tôi chuyển sang tệp tiếp theo.

Khi tôi đọc xong trong tất cả các tệp, tôi muốn xóa các ô trống của a. Tôi cố gắng if a(i)==[]

Trả lời

53

Sử dụng CELLFUN

%# find empty cells 
emptyCells = cellfun(@isempty,a); 
%# remove empty cells 
a(emptyCells) = []; 

Lưu ý: a(i)==[] sẽ không hoạt động. Nếu bạn muốn biết liệu ô thứ i có trống không, bạn phải sử dụng dấu ngoặc nhọn để truy cập nội dung của ô. Ngoài ra, ==[] đánh giá để trống, thay vì true/false, vì vậy bạn nên sử dụng lệnh isempty thay thế. Tóm lại: a(i)==[] nên được viết lại là isempty(a{i}).

+15

cho một sự cải thiện nhẹ trong sử dụng tốc độ 'emptyCells = cellfun ('isEmpty', a); '...' cellfun' có một công tắc nội bộ' 'câu lệnh kiểm tra xem chuỗi có phải là một trong số ít các hàm mà nó có thể làm tăng tốc" ma thuật "với ... Điều này được mô tả ở đây: http://undocumentedmatlab.com/blog/cellfun-undocumented-performance -boost/ – JudoWill

+0

+1 để chỉ định cách xóa các ô trống! Điều này khiến bạn có một mảng ô chỉ chứa các mục nhập không trống! – Matteo

0

Tất cả các câu trả lời được đề cập ở trên không chính xác, vì trong trường hợp của tôi khi tôi sử dụng chúng, chúng loại bỏ các ô trống và sau đó tất cả các phần tử của mảng ô của tôi nằm theo hàng thay vì giữ nguyên hình dạng thực của chúng. Trong thực tế, sau khi sử dụng phương pháp này, các phần tử mảng tế bào của bạn có xu hướng là một vectơ tế bào hàng.

Tôi đã tìm thấy cách tiếp cận này hoạt động chính xác trong trường hợp của tôi.

nguồn: https://groups.google.com/forum/#!topic/comp.softsys.matlab/p3NX0fI6u90

cách tiếp cận:

myCellARRAY(all(cellfun(@isempty,myCellARRAY),2), :) = []; 
Các vấn đề liên quan