Matlab - 在矩阵中将1翻转为0

时间:2012-12-06 03:10:57

标签: matlab

我有一个非常大的稀疏矩阵(每行有几千个元素 - 大多数元素都是0)。另外,我有一个行索引向量,我需要在每一行上执行以下操作:

将非零元素的一半(从行中的所有非零元素中随机选择)翻转为零,并保存翻转元素的列索引。

感谢您的任何指示。

1 个答案:

答案 0 :(得分:2)

您可以使用randperm()生成要连续归零的列的随机顺序。

% A: sparse matrix (assume 2d)
% ri = vector or row indices

for i = 1:numel(ri)               % Edit one row of A at a time
    row = A( ri(i), : );
    c = find( row );              % Find column index of all non-zero elements a row
    cdel = randperm(length(c));   % Random rearrangement of column index
    cdel(1:end/2) = [];           % Only want to zero out half the columns, so ignore the other half
    % c(cdel) will give the column index of elements to be zeroed.
    row( 1, c(cdel) ) = 0;        % Zero out selected columns
    A( ri(i), : ) = row;          % Update A
end

代码中可能存在一些错误,因为我还没有测试过。 还有一些步骤是多余的,可以合并。

c(cdel)将为您提供所翻转列的必需索引。您可以将其保存在单元格向量中,因为每行的大小可能会更改。你可以通过

来做到这一点
fcol{i} = c(cdel);