我有一个这样的矩阵:
1 5 7 3 1 0
1 8 1 0 0 0
2 4 6 2 0 0
2 9 10 2 0 0
0 0 0 0 0 0
我想把它改成。。。
1 5 7 3 1
1 8 1
2 4 6 2
2 9 10 2
请帮我
如果输出可以是一个单元格数组,那么这样的东西就可以了。
% assume input is the first matrix
output = cell(size(input,1), 1);
for i = 1:length(output)
output{i} = input(i, input(i, :) ~= 0);
end
这样做的目的是创建一个与原始单元格具有相同行数的单元格数组,然后在原始单元格中循环查找非零条目并保留它们。
您可以只保留非零值,而不保留任何行信息,方法如下:
output = input(input ~= 0);
这使用线性索引,并将矩阵展平为向量。
对于多样性,这里有一个不使用循环的方法:
in = [1 5 7 3 1 0; 1 8 1 0 0 0; 2 4 6 2 0 0; 2 9 10 2 0 0; 0 0 0 0 0 0]; % example data
[~, inds, vals] = find(in.'); % column indices and values of nonzeros of transposed input
result = accumarray(inds, vals, [size(in,1) 1], @(x){x.'}); % group by index
要了解它是如何工作的,您可能需要阅读find
和accumarray
函数的文档,以及这个答案,以了解为什么需要转置。