octave - recorrer - ¿Cómo insertar una columna/fila de unos en una matriz?
programas hechos en octave (6)
En GNU Octave:
Concatene dos matrices juntas horizontalmente: separe 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 "Columna" horizontal con una coma):
octave:1> [[3,4,5],8]
ans =
3 4 5 8
Pegue otra matriz horizontalmente (como columnas adicionales) utilizando una coma:
octave:2> [[3,4,5],[7,8,9]]
ans =
3 4 5 7 8 9
Pegue otra matriz verticalmente (como filas adicionales) utilizando un punto y coma:
octave:3> [[3,4,5];[7,8,9]]
ans =
3 4 5
7 8 9
Supongamos que tenemos una matriz de 3x3 como
b = 2 * eye(3);
ans =
2 0 0
0 2 0
0 0 2
Y quiero una matriz de 3x4 como
1 2 0 0
1 0 2 0
1 0 0 2
¿Cuál es la mejor manera de conseguirlo?
La función padarray (del paquete de imágenes ) 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 leen pre pad de la variable b
con 0 filas y 1 columna . La función permite una gran flexibilidad al rellenar matrices, pero puede ser una exageración para cosas realmente simples.
La matriz b se define como a continuación
>> 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 abajo
>> [ones(size(b)(2), 1)'';b]
ans =
1 1 1
1 2 3
4 5 6
7 8 9
Me gustaría señalar que [AB]
realidad crea una nueva matriz que se opone a la inserción , lo que debería ser obvio por su construcción sintáctica. Pero veo una gran cantidad de lugares que utilizan la palabra agregar o insertar que me pregunto si octava hace algo inteligente detrás, así que hago 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 aqui esta 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
Entonces, si necesita hacer crecer continuamente su matriz, primero cree la matriz objetivo y luego asigne un valor. O implementa algo como cambiar el tamaño de la matriz si no conoces la dimensión definitiva de antemano.
Una forma de hacerlo es:
function [result] = prependOnes(matrix)
result = [ones(rows(matrix),1) matrix];
end
prependOnes(b)
Una forma fácil de hacer esto en línea es:
b = [ones(size(b, 1), 1) b];