2017-09-06 5 views
2

Je voulais demander de l'aide sur les points suivants: J'ai un ensemble de données 131573 * 8 et je voudrais ajouter 19247 * 8 zéro lignes à l'ensemble de données. Les lignes zéro doivent être ajoutés à des endroits spécifiques, que j'ai stockées dans une matrice YE, ce qui est de la taille: 19247 * 1.Matlab: ajouter une ligne de zéros à des nombres spécifiques de ligne

Pour donner un exemple: Le premier élément de YE est le nombre 56. Pour cette ligne spécifique, je voudrais ajouter une rangée de zéros dans l'ensemble de données de la matrice. maintenant rangée ensemble de données 55-57 ressemble à:

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

Il devrait être:

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

J'espère que quelqu'un peut me aider - je ne l'ai pas encore trouvé de solution.

Merci!

Répondre

3

Si vous souhaitez insérer rangées de zéros dans dataset à des indices spécifiques de ligne, d'une manière vectorisé est d'initialiser une matrice de zéros de taille finale désirée, puis remplissez les lignes ne sont pas dans l'index vecteur YE avec le contenu de dataset:

N = size(dataset, 1)+size(YE, 1); 
result = zeros(N, size(dataset, 2)); 
result(setdiff(1:N, YE), :) = dataset; 

Cependant, la solution ci-dessus crée une nouvelle matrice result, qui utilise plus de mémoire. Si vous souhaitez modifier dataset directement et enregistrer sur la mémoire (car il est une grande matrice), voici une alternative:

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

Salut gnovice, merci pour votre réponse rapide! La solution remplace la ligne par des zéros mais elle doit ajouter la ligne (comme une ligne supplémentaire). J'ai mis à jour l'exemple car je pense que cela explique mieux le problème. – Marius

+1

@Marius: La réponse a été mise à jour. – gnovice

+0

Merci beaucoup gnovice, une solution très propre et utile! – Marius

1

Utilisez votre index YE pour définir les lignes à 0:

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

edit: Je vois que vous essayez d'insérer les zéros, plutôt que de mettre cette ligne égale à 0, donc ne pas tenir compte de ce qui précède. Je vous recommande de convertir votre index logique YE en numéros de lignes, puis en procédant comme suit:

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 
+0

Salut Joel, je vois ce que tu veux dire. Cela fonctionne pour remplacer la ligne dans l'ensemble de données, mais je voudrais ajouter une «nouvelle» ligne. Peut-être que l'exemple mis à jour clarifie le problème mieux? – Marius

+1

Ouais je me suis rendu compte qu'après l'avoir écrit, voir ma mise à jour. –

+1

En regardant de plus près, il semble que votre index YE inclut déjà des numéros de lignes?Si oui, ma solution ci-dessus devrait fonctionner, ignorez simplement la première ligne (rowsYE = find (YE == 1); –