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?
Un moyen simple en ligne de faire ceci est:
b = [ones(size(b, 1), 1) b];
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
Une façon de le faire est:
function [result] = prependOnes(matrix)
result = [ones(rows(matrix),1) matrix];
end
prependOnes(b)
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.
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.
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