想请求以下方面的帮助:我有一个数据集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
我希望有人可以帮助我 - 我还没有找到任何解决方案。
谢谢!
答案 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