matlab:在特定行号处添加一行零

matlab: add a row of zeros at specific row numbers

想就以下问题寻求帮助:我有一个数据集 131573*8,我想向该数据集添加 19247*8 个零行。需要在特定位置添加零行,我将其存储在矩阵 YE 中,大小为:19247*1。

举个例子: YE 的第一个元素是数字 56。对于该特定行,我想在矩阵数据集中添加一行零。 现在数据集第 55-57 行看起来像:

55: 11 12 13 14 15 16 17 18

56: 21 22 23 24 25 26 27 28

57: 31 32 33 34 35 36 37 38

应该是:

55: 11 12 13 14 15 16 17 18

56: 0 0 0 0 0 0 0 0

57: 21 22 23 24 25 26 27 28

58: 31 32 33 34 35 36 37 38

我希望有人能帮助我 - 我还没有找到任何解决方案。

谢谢!

如果您想在特定行索引处 插入 行零到 dataset 中,一种矢量化方法是初始化所需最终大小的零矩阵,然后用 dataset:

的内容填充索引向量 YE 不是 的行
N = size(dataset, 1)+size(YE, 1);
result = zeros(N, size(dataset, 2));
result(setdiff(1:N, YE), :) = dataset;

但是,上述解决方案创建了一个 new 矩阵 result,它使用了更多内存。如果您想直接修改 dataset 并节省内存(因为它是一个大矩阵),这里有一个替代方案:

% Add the necessary number of rows of zeroes to the end:
dataset = [dataset; zeros([size(YE, 1) size(dataset, 2)])];

% Create an index vector to reorder the rows:
[~, index] = sort([setdiff(1:size(dataset, 1), YE).'; YE]);

% Reorder the rows:
dataset = dataset(index, :);

使用索引 YE 将行设置为 0:

dataset(YE, :) = zeros(1, size(dataset,2));

编辑:我看到您正在尝试插入零,而不是将该行设置为 0,因此请忽略上述内容。我建议将您的逻辑索引 YE 转换为行号,然后按如下方式操作:

rowsYE = find(YE == 1);
for idx = 1:length(rowsYE)
    newData = dataset(1:rowsYE(idx)-1,:);  % temp variable to hold data
    newData(rowsYE(idx),:) = zeros(1,size(dataset,2)); % add a row of zeros
    newData = [newData; dataset(rowsYE(idx):end,:)]; % add the rest of the data set
    dataset = newData; % set the dataset = to temp 
    rowsYE = rowsYE + 1; % increment the rows index (since we added a new row)
end