resueltos recorrer programas para matriz matrices hechos graficar funciones ejercicios ejemplos comentarios comandos octave

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];