¿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?
6 answers
Una forma fácil de hacer esto es:
b = [ones(size(b, 1), 1) b];
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
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)
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.
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.
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
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