How can I delete specific columns from a matrix?
1 次查看(过去 30 天)
显示 更早的评论
I have a 3xn matrix of data, and anywhere that data is repeated I've converted it to a column of zeros. Now, I want to clear the zero columns and leave only the relevant data. How can I do this? I've tried:
for i = length(matrix):1
if matrix(1,i) == 0
matrix(:,i) = [];
end
end
and it doesn't work. Please help. Here is the matrix I'm currently working with:
Columns 1 through 15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Columns 16 through 30
0 0 0 0 0 0 0 9 0 0 0 10 0 11 11
0 0 0 0 0 0 0 2 0 0 0 6 0 1 6
0 0 0 0 0 0 0 3 0 0 0 8 0 7 9
Columns 31 through 36
0 0 12 12 0 0
0 0 1 2 0 0
0 0 4 8 0 0
0 个评论
采纳的回答
Guillaume
2017-7-3
编辑:Guillaume
2017-7-3
Of course, it does not work:
for i = length(matrix):1
I assume you're trying to run the loop in reverse so that you don't shift rows yet to process as you delete rows. That's not how you tell matlab to run a loop in reverse. You have to specify the increment/decrement. Also, never use length on a matrix. If your n is less than 3, it'll return the number of columns instead and leads to interesting bugs. Always use size with an explicit dimension. So:
for i = size(matrix, 2):-1:1
would work. However, a loop is just a waste of time when it can all be accomplished in just one line with:
matrix(:, matrix(1, :) == 0) = [];
3 个评论
Guillaume
2017-7-3
Sorry, an extra closing bracket got in there by mistake. Fixed now (and also edited to delete columns instead of rows as I misread your post.
更多回答(2 个)
Andrei Bobrov
2017-7-3
your_mtx = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 10 0 11 11 0 0 12 12 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 6 0 1 6 0 0 1 2 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 8 0 7 9 0 0 4 8 0 0];
out = your_mtx(:,any(your_mtx));
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!