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

时间:2017-09-06 15:17:16

标签: matlab insert rows zero

想请求以下方面的帮助:我有一个数据集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

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

谢谢!

2 个答案:

答案 0 :(得分:3)

如果你想在特定的行索引中插入零行到dataset,一种向量化的方法是初始化你想要的最终大小的零的矩阵,然后填充行索引向量YE中的不是,其内容为dataset

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, :);

答案 1 :(得分:1)

使用索引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