web-dev-qa-db-fra.com

Comment insérer une colonne/ligne de uns dans une matrice?

Supposons que nous ayons une matrice 3x3 comme 

b = 2 * eye(3);
ans =

2   0   0
0   2   0
0   0   2

et je veux une matrice 3x4 comme 

1   2   0   0
1   0   2   0
1   0   0   2

Quel est le meilleur moyen de l'obtenir? 

48
ecerulm

Un moyen simple en ligne de faire ceci est:

b = [ones(size(b, 1), 1) b];

89
carl_h

Dans GNU Octave: 

Concaténer horizontalement deux matrices: séparer les matrices par un espace,
et mettez le résultat entre crochets:

X = [ones(rows(X), 1) X];

Exemples plus simples:
Coller sur un chiffre (ajouter un élément "Column" horizontal avec une virgule):

octave:1> [[3,4,5],8]
ans =
   3   4   5   8

Collez horizontalement une autre matrice (en tant que colonnes supplémentaires) en utilisant une virgule:

octave:2> [[3,4,5],[7,8,9]]
ans = 
   3   4   5   7   8   9

Collez une autre matrice verticalement (en tant que rangées supplémentaires) en utilisant un point-virgule:

octave:3> [[3,4,5];[7,8,9]]
ans =
   3   4   5
   7   8   9
15
sdn342323

Une façon de le faire est: 

function [result] = prependOnes(matrix)
  result = [ones(rows(matrix),1) matrix];
end

prependOnes(b)
7
ecerulm

Je voudrais souligner que [A B] crée en fait une nouvelle matrice opposée à insérant , ce qui devrait être évident à partir de sa construction syntaxique. Mais je vois beaucoup de place utiliser le mot append ou insert dans lequel je me demande si octave fait quelque chose d'intelligent derrière, alors je lance un test

function testAppend(repeat)

profile off;
profile on; 
testAdd(repeat);
testAssign(repeat);
profile off;
data = profile('info');
profshow(data, 5); 

end

function testAdd(repeat)
for i = 1:repeat
    A = ones(100, 1); 
    B = ones(100, 1); 
    for j = 1:10000
        A = [A B]; 
    end 
end
end

function testAssign(repeat)
for i = 1:repeat
    B = ones(100, 1); 
    A = zeros(100, 10000);
    for j = 2:10001
        A(:, j) = B;
    end 
end
end

et voici le résultat

octave:1> testAppend(1)
   #              Function Attr     Time (s)        Calls
---------------------------------------------------------
   1    testAppend>testAdd             9.454            1
   3 testAppend>testAssign             0.023            1
   4                 zeros             0.001            1
   5               profile             0.000            1
   2                  ones             0.000            3

Donc, si vous devez agrandir continuellement votre matrice, créez-la d'abord, puis attribuez-lui une valeur. Ou bien implémentez quelque chose comme une matrice de redimensionnement si vous ne connaissez pas la dimension ultime à l'avance.

3
Sky

La fonction padarray _ (du package d'image _) a été conçue pour faire exactement cela.

octave> b = 2 * eye (3)
b =

Diagonal Matrix

   2   0   0
   0   2   0
   0   0   2

octave> padarray (b, [0 1], 1, "pre")
ans =

   1   2   0   0
   1   0   2   0
   1   0   0   2

La fonction lit pre la variable b avec 0 lignes et 1 colonne. La fonction permet une grande flexibilité lors du remplissage des matrices mais peut être excessive pour des choses très simples.

2
carandraug

La matrice b est définie comme suit

>> b = [1 2 3;4 5 6;7 8 9]
b =

   1   2   3
   4   5   6
   7   8   9

créer une nouvelle matrice en ajoutant une nouvelle colonne de 1 comme ci-dessous

>> [ones(size(b), 1) b]
ans =

   1   1   2   3
   1   4   5   6
   1   7   8   9

Créer une nouvelle matrice en ajoutant une nouvelle ligne de 1 comme ci-dessous

>> [ones(size(b)(2), 1)';b]
ans =

   1   1   1
   1   2   3
   4   5   6
   7   8   9
0
rainu