我有一个非常大的稀疏矩阵(每行有几千个元素——大多数元素都是 0)。另外,我有一个行索引向量,我需要对每一行执行以下操作:
将一半的非零元素(从行中的所有非零元素中随机选择)翻转为零,并保存翻转元素的列索引。
感谢您的任何指示。
我有一个非常大的稀疏矩阵(每行有几千个元素——大多数元素都是 0)。另外,我有一个行索引向量,我需要对每一行执行以下操作:
将一半的非零元素(从行中的所有非零元素中随机选择)翻转为零,并保存翻转元素的列索引。
感谢您的任何指示。
您可以使用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);