¿Cómo insertar una columna / fila de unos en una matriz?


Supongamos que tenemos una matriz 3x3 como

b = 2 * eye(3);
ans =

2   0   0
0   2   0
0   0   2

Y quiero una matriz 3x4 como

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

¿Cuál es la mejor manera de conseguirlo?

 45
Author: ecerulm, 2013-12-02

6 answers

Una forma fácil de hacer esto es:

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

 80
Author: carl_h,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-02 19:55:52

En la octava de GNU:

Concatenar dos matrices juntas horizontalmente: separar las matrices por un Espacio,
y encierre el resultado entre corchetes:

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

Ejemplos más simples:
Pegue un número (agregue un elemento horizontal "Columna" con una coma):

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

Pegue en otra matriz horizontalmente (como columnas adicionales) usando una Coma:

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

Pegue en otra matriz verticalmente (como filas adicionales) usando un punto y coma:

octave:3> [[3,4,5];[7,8,9]]
ans =
   3   4   5
   7   8   9
 13
Author: sdn342323,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-18 17:53:37

Una forma de hacerlo es:

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

prependOnes(b)
 7
Author: ecerulm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-04 06:08:24

Me gustaría señalar que [A B] en realidad crea una nueva matriz en oposición a insertar, lo que debería ser obvio a partir de su construcción sintáctica. Pero veo mucho lugar usar la palabra append o insert que me pregunto si octave hace alguna cosa inteligente detrás, así que corro una prueba

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

Y aquí está el resultado

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

Así que si necesita hacer crecer continuamente su matriz, primero cree la matriz de destino y luego asígnele un valor. O implemente algo como redimensionar-matrix si no conoce la dimensión definitiva de antemano.

 3
Author: Sky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-18 03:29:57

La función padarray (del paquete de imagen ) fue diseñada para hacer exactamente eso.

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

Las funciones dicen pre pad la variable b con 0 filas y 1 columna. La función permite una gran flexibilidad al rellenar matrices, pero puede ser excesiva para cosas realmente simples.

 2
Author: carandraug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-02 20:08:11

La matriz b se define como sigue

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

   1   2   3
   4   5   6
   7   8   9

Creando una nueva matriz agregando una nueva columna de 1s como se muestra a continuación

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

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

Creando una nueva matriz agregando una nueva fila de 1s como se muestra a continuación

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

   1   1   1
   1   2   3
   4   5   6
   7   8   9
 0
Author: rainu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-19 13:33:30