How to delete zeros from matrix in MATLAB?

こ雲淡風輕ζ 提交于 2019-12-31 01:25:09

问题


Here is my problem:

I have a nxn matrix in matlab. I want to delete all the zeros of this matrix and put the rows of it in vectors. For n=4, let say I have the following matrix:

A = [ 1 1 0 0
      1 2 0 0
      1 0 0 0
      1 2 1 0 ];

How to get the following:

v1 = [ 1 1 ]; 
v2 = [ 1 2 ]; 
v3 = [ 1 ]; 
v4 = [ 1 2 1 ]; 

I did the following:

for i = 1:size(A, 1)
    tmp = A(i, :);
    tmp(A(i, :)==0)=[];
    v{i} = tmp;
end

回答1:


Slightly faster than Divakar's answer:

nzv = arrayfun(@(n) nonzeros(A(n,:)), 1:size(A,1), 'uniformoutput', false);

Benchmarking

Small matrix

A = randi([0 3],100,200);
repetitions = 1000;

tic
for count = 1:repetitions
  nzv =cellfun(@(x) nonzeros(x),mat2cell(A,ones(1,size(A,1)),size(A,2)),'uni',0);
end
toc

tic
for count = 1:repetitions
  nzv = arrayfun(@(n) nonzeros(A(n,:)), 1:size(A,1), 'uniformoutput', false);
end
toc

Elapsed time is 3.017757 seconds.
Elapsed time is 2.025967 seconds.

Large matrix

A = randi([0 3],1000,2000);
repetitions = 100;

Elapsed time is 11.483947 seconds.
Elapsed time is 5.563153 seconds.



回答2:


Convert to a cell array such that you have a cell for each row and then use nonzeros for each cell, that deletes zeros and finally store them into separate variables.

Code

nzv =cellfun(@(x) nonzeros(x),mat2cell(A,ones(1,size(A,1)),size(A,2)),'uni',0)
[v1,v2,v3,v4] = nzv{:}


来源:https://stackoverflow.com/questions/25530935/how-to-delete-zeros-from-matrix-in-matlab

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!