2012-03-14 13 views
7

Tôi muốn xóa tất cả các ô trống ở dưới cùng của mảng ô matlab. Tuy nhiên tất cả các ví dụ mã mà tôi tìm thấy thu gọn ma trận thành một vectơ, đó không phải là những gì tôi muốn.xóa ô trống trong MATLAB

Vì vậy, mã này

a = { 1, 2; 3, 4; [], []} 
emptyCells = cellfun('isempty', a); 
a(emptyCells) = [] 

kết quả trong vector này

a = [1] [3] [2] [4]

Nhưng tôi muốn thay vì mảng này

a =

[1] [2] 

[3] [4] 

Tôi làm như thế nào?

Trả lời

15

Nếu bạn muốn xóa tất cả các hàng trong mảng di động của bạn, nơi tất cả các tế bào là trống rỗng, bạn có thể sử dụng follwing:

a = { 1, 2; 3, 4; [], []} 
emptyCells = cellfun('isempty', a); 

a(all(emptyCells,2),:) = [] 

a = 
    [1] [2] 
    [3] [4] 

Lý do nó đã không làm việc trong công thức của bạn là nếu bạn chỉ số với một mảng, đầu ra được định hình lại thành một vectơ (vì không có đảm bảo rằng toàn bộ các hàng hoặc cột sẽ bị xóa và không chỉ đơn giản là các phần tử riêng lẻ ở đâu đó).

1

này làm việc cho tôi:

a = { 1, 2; 3, 4; [], []}; 
emptyCells = cellfun('isempty', a); 
cols = size(a,2); 
a(emptyCells) = []; 
a = reshape(a, [], cols); 

nhưng tôi không chắc chắn nếu nó sẽ đủ chung của bạn - bạn sẽ luôn có hàng hoàn chỉnh các ô trống ở dưới cùng của mảng của bạn?

+0

Hiện tại có, nhưng nói chung tôi không thể chắc chắn. Tôi cũng nghĩ đến việc sử dụng định hình lại, nhưng cuối cùng tôi đã sử dụng một tìm kiếm đơn giản cho hàng cuối cùng không phải là trống, bởi vì tôi tìm thấy mã bạn đăng quá phức tạp hoặc công việc chính. –

0

Một giải pháp đơn giản hơn rất cụ thể cho vấn đề của bạn là để chuyển đổi các tế bào trực tiếp vào một ma trận:

cleanedA = cell2mat(a); 

Nó chuyển thành một ma trận bình thường, và khi làm điều này nó loại bỏ các tế bào trống.

Sau đó, tất nhiên, bạn có thể chuyển đổi lại nó vào một mảng di động với các lệnh sau:

a = mat2cell(cleanedA, [1 1], [1 1]) 

nó không chung chung, nhưng ví dụ như đăng nó là giải pháp đơn giản nhất tôi có thể nghĩ đến.

+0

Trên thực tế mảng ô của tôi bao gồm chủ yếu là các chuỗi, vì vậy cell2mat không hữu ích cho tôi. –

1

Có chức năng tổng quát hóa việc xóa hàng/cột cụ thể khỏi ô, được gọi là fun_removecellrowcols. Do việc loại bỏ, kích thước ô được thay đổi kích thước.