La mejor manera de obtener un vector de la matriz escasa -- matlab campo con sparse-matrix camp Relacionados El problema

best way to get a vector from sparse matrix


-1
vote

problema

Español

Tengo un m x n matriz donde cada fila consta de ceros y los mismos valores para cada fila.

Un ejemplo sería:

  M = [-0.6 1.8 -2.3 0 0 0; 0 0 0 3.4 -3.8 -4.3; -0.6 0 0 3.4 0 0]   

En este ejemplo, la primera columna consiste en 0 S y -0.6 , SEGUNDO 0 y 1.8 , TERCERO -2.3 y así sucesivamente.

En tal caso, me gustaría reducir M a 1 (obtener un vector de una matriz determinada), por lo que en este ejemplo, un vector sería [-0.6 1.8 -2.3 3.4 -3.8 -4.3]

¿Alguien sabe cuál es la mejor manera de obtener un vector de dicha matriz?

¡Gracias!

Original en ingles

I have a m x n matrix where each row consists of zeros and same values for each row.

an example would be:

M = [-0.6 1.8 -2.3 0 0 0; 0 0 0 3.4 -3.8 -4.3; -0.6 0 0 3.4 0 0] 

In this example the first column consists of 0s and -0.6, second 0 and 1.8, third -2.3 and so on.

In such case I would like to reduce m to 1 (get a vector from a given matrix) so in this example a vector would be [-0.6 1.8 -2.3 3.4 -3.8 -4.3]

Does anyone know what is the best way to get a vector from such matrix?

Thank you!

     
 
 

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Aquí hay un único forro que usa la función suma < / a>:

  tahwil.Value{}7  

Esto devolverá un vector 1 por N que contiene el valor no cero repetido de cada columna. Lo hace sumando cada columna, luego dividiendo el resultado por el número de valores no cero en cada columna. Si no hay valores no cero en una columna, el resultado de esa columna será nan .

Aquí hay un ejemplo utilizando la matriz de muestra tahwil.Value{}8 en la pregunta:

  tahwil.Value{}9  
 

Here's a one-liner that uses the function SUM:

nonZeroColumnValues = sum(M)./sum(M ~= 0); 

This will return a 1-by-n vector that contains the repeated non-zero value from each column. It does so by summing each column, then dividing the result by the number of non-zero values in each column. If there are no non-zero values in a column, the result for that column will be NaN.

Here's an example using the sample matrix M in the question:

>> M = [-0.6 1.8 -2.3 0 0 0; 0 0 0 3.4 -3.8 -4.3; -0.6 0 0 3.4 0 0]  M =     -0.6000    1.8000   -2.3000         0         0         0          0         0         0    3.4000   -3.8000   -4.3000    -0.6000         0         0    3.4000         0         0  >> nonZeroColumnValues = sum(M)./sum(M ~= 0)  nonZeroColumnValues =     -0.6000    1.8000   -2.3000    3.4000   -3.8000   -4.3000 
 
 
 
 
1
 
vote

Si hay un número desconocido de no zeros y ceros, una forma de solucionar el problema es reemplazar primero a los ceros con los NAV, y luego usar algo como MAX o MIN para encontrar los datos.

  %# create an array M = [-0.6 1.8 -2.3 0 0 0; 0 0 0 3.4 -3.8 -4.3; -0.6 0 0 3.4 0 0];  %# replace zeros with NaN M(M==0) = NaN;  %# get, for each column, the number numbers = max(M,[],1)  numbers =      -0.6000    1.8000   -2.3000    3.4000   -3.8000   -4.3000   

editar

Así es como entendí la pregunta: "Quiero, para cada columna, conocer el valor de las entradas no cero. Solo hay un número que no tiene cero por columna, pero podría ocurrir varias veces"

Aquí hay una forma más similar a Matlab (pero más larga) de obtener la solución:

  %# create an array     M = [-0.6 1.8 -2.3 0 0 0; 0 0 0 3.4 -3.8 -4.3; -0.6 0 0 3.4 0 0];  %# find the non-zero entries [r,c] = find(M);  %# only take one entry per column [uniqueCols, sortIdx] = unique(c);  %# fix the rows correspondingly uniqueRows = r(sortIdx);  %# convert to index idx = sub2ind(size(M),uniqueRows,uniqueCols);  %# get the numbers per column (transpose as needed) numbers = M(idx)  numbers =     -0.6000     1.8000    -2.3000     3.4000    -3.8000    -4.3000   
 

If there's an unknown number of non-zeros and zeros, one way to fix the problem is to first replace the zeros with NaNs, and then use something like max or min to find the data.

%# create an array M = [-0.6 1.8 -2.3 0 0 0; 0 0 0 3.4 -3.8 -4.3; -0.6 0 0 3.4 0 0];  %# replace zeros with NaN M(M==0) = NaN;  %# get, for each column, the number numbers = max(M,[],1)  numbers =      -0.6000    1.8000   -2.3000    3.4000   -3.8000   -4.3000 

EDIT

This is how I understood the question: "I want, for every column, to know the value of the non-zero entries. There is only one non-zero number per column, but it could occur multiple times"

Here is a more Matlab-like (but longer) way to get the solution:

%# create an array     M = [-0.6 1.8 -2.3 0 0 0; 0 0 0 3.4 -3.8 -4.3; -0.6 0 0 3.4 0 0];  %# find the non-zero entries [r,c] = find(M);  %# only take one entry per column [uniqueCols, sortIdx] = unique(c);  %# fix the rows correspondingly uniqueRows = r(sortIdx);  %# convert to index idx = sub2ind(size(M),uniqueRows,uniqueCols);  %# get the numbers per column (transpose as needed) numbers = M(idx)  numbers =     -0.6000     1.8000    -2.3000     3.4000    -3.8000    -4.3000 
 
 
         
         
0
 
vote

Esta no es realmente una matriz escasa. Una matriz escasa en Matlab se define como tal. Si usa las funciones escasas o SPDiags para definir esa matriz, no será necesario almacenar los elementos cero, solo los no ceros. Por supuesto, Matlab sabe cómo trabajar con estas verdaderas matrices escasas junto con otras matrices dobles estándar.

Finalmente, las verdaderas matrices escasas suelen ser mucho más escasas que esto, o no se molestaría en usar el formulario de almacenamiento escaso en absoluto.

Independientemente, si solo desea los elementos no cero de cualquier matriz, entonces puede hacer esto:

  NZ = M(M ~= 0);   

alternativamente,

  NZ = M(find(M));   

Se esforzará con los no ceros por columnas, ya que es así como se almacenan los números en una matriz en Matlab.

  NZ = M(find(M)) NZ =          -0.6          -0.6           1.8          -2.3           3.4           3.4          -3.8          -4.3   

En su pregunta, solicitó cómo hacer esto por filas, extraer los elementos que no son cero en la primera fila, luego la segunda fila, etc.

Esto se hace simplemente transponen la matriz primero. Por lo tanto, podríamos hacer algo como ...

  NZ = M.'; NZ = NZ(find(NZ)) NZ =          -0.6           1.8          -2.3           3.4          -3.8          -4.3          -0.6           3.4   

ver que usé '. Para hacer la transposición, en caso de que cualquier elemento fuera complejo.

 

This is NOT actually a sparse matrix. A sparse matrix in MATLAB is defined as such. If you use the sparse or spdiags functions to define that matrix, then the zero elements will not need to be stored, only the non-zeros. Of course, MATLAB knows how to work with these true sparse matrices in conjunction with other standard double arrays.

Finally, true sparse matrices are usually much more sparse than this, or you would not bother to use the sparse storage form at all.

Regardless, if you only want the non-zero elements of ANY matrix, then you can do this:

NZ = M(M ~= 0); 

alternatively,

NZ = M(find(M)); 

Either will string out the non-zeros by columns, because that is how numbers are stored in a matrix in MATLAB.

NZ = M(find(M)) NZ =          -0.6          -0.6           1.8          -2.3           3.4           3.4          -3.8          -4.3 

In your question, you asked for how to do this by rows, extracting the non-zero elements in the first row, then the second row, etc.

This is most simply done by transposing the array first. Thus, we might do something like...

NZ = M.'; NZ = NZ(find(NZ)) NZ =          -0.6           1.8          -2.3           3.4          -3.8          -4.3          -0.6           3.4 

See that I used .' to do the transpose, just in case any elements were complex.

 
 
   
   
0
 
vote

M = M(M~=0)

o

M(find(M))

y aprenda cómo formatear el código para los lectores.

Editar @jonas sugiere que la OP solo quiere una ocurrencia de cada elemento distinto de cero de M. para obtener este intento de envolver cualquiera de las sugerencias anteriores en unique() , como

  unique(M(M~=0))   
 

M = M(M~=0)

or

M(find(M))

and please learn how to format code for SO readers.

EDIT @Jonas suggests that OP wants only one occurrence of each non-zero element from M. To get this try wrapping either of the foregoing suggestions in unique(), such as

unique(M(M~=0)) 
 
 
0
 
vote

Si la OP realmente quiere encontrar los elementos que no son cero que también son únicos, entonces hay formas mucho mejores de hacerlo de lo que sugiere Jonas.

La solución lógica es encontrar los elementos que no son cero primero. Luego aplique la función única. Así que haz esto:

  %# create an array     M = [-0.6 1.8 -2.3 0 0 0; 0 0 0 3.4 -3.8 -4.3; -0.6 0 0 3.4 0 0];  %# find the non-zero entries [r,c] = find(M);  %# only take one entry per column [uniqueCols, sortIdx] = unique(c);  %# fix the rows correspondingly uniqueRows = r(sortIdx);  %# convert to index idx = sub2ind(size(M),uniqueRows,uniqueCols);  %# get the numbers per column (transpose as needed) numbers = M(idx)  numbers =     -0.6000     1.8000    -2.3000     3.4000    -3.8000    -4.3000 0  

Si su objetivo es encontrar esos elementos en un orden específico, entonces ese orden debe definirse explícitamente en su objetivo.

 

If the OP REALLY wants to find the non-zero elements that are also unique, then there are far better ways to do so than Jonas suggests.

The logical solution is to find the non-zero elements FIRST. Then apply the function unique. So do this:

unique(M(find(M))) 

If your goal is to find those elements in a specific order, then that order needs to be explicitly defined in your goal.

 
 
     
     

Relacionados problema

1  Matriz escasa OPENCV: Cómo obtener los índices de elementos que no son cero en una fila / columna  ( Opencv sparse matrix how to get the indices of non zero elements in a row colum ) 
¿Hay alguna manera de obtener los índices de todos los no ceros de una fila específica de un SPARSEmat 2D, sin bucle sobre la fila? El siguiente código, usa...

5  ¿Media de valores no cero en la matriz escasa?  ( Mean of non zero values in sparse matrix ) 
Estoy tratando de calcular la media de los valores no cero en cada fila de una matriz de fila escasa. El uso del método medio de la matriz no lo hace: >>> ...

1  MATLAB: Fuera de la memoria cuando concaten la matriz escasa con un vector  ( Matlab out of memory when concatenating sparse matrix with a vector ) 
He creado una matriz escasa de 3560 x 3560, A . Luego creo dos vectores de 1 x 3560, 9988777661 y T . Cuando ejecuto el siguiente código (que concatena S ...

0  Generar una matriz escasa aleatoria llena de valores superiores a 1 Python  ( Generate random sparse matrix filled with values greater than 1 python ) 
El método disponible en Python Scipy sps.rand() genera una matriz escasa de valores aleatorios en el rango (0,1). ¿Cómo podemos generar valores aleatorios d...

1  Parcelable Encontrada IOException Escritura Serializable Objeto SPAREARRARY <INT []>  ( Parcelable encountered ioexception writing serializable object sparsearrayint ) 
Así que quería enviar en el paquete a SparseArray, pero como no puedo hacer una clase para hacer que la espantara en un objeto serializable, pero ahora cuando...

1  Suelos de álgebra lineal escasa para C #  ( Sparse linear algebra solvers for c sharp ) 
Estoy trabajando en una implementación experimental del algoritmo de tela inextensible de Goldenthal Et.al en C #. Primero usé math.net iridium para ensambl...

7  Multiplicación de matriz grande y escasa  ( Large and sparse matrix multiplcation ) 
Tengo una matriz muy grande y escasa de tamaño de 180 GB (texto, 30 k * 3 m) que contiene solo las entradas y sin datos adicionales. Tengo que hacer multiplic...

2  ERROR: Se excede el tamaño máximo de la variable permitido por el programa. mientras usa sub2ind  ( Errormaximum variable size allowed by the program is exceeded while using sub2 ) 
Sugiere cómo solucionar este problema: nNodes = 50400; adj = sparse(nNodes,nNodes); adj(sub2ind([nNodes nNodes], ind, ind + 1)) = 1; %ind is a vector of i...

2  ¿Convertir el fragmento de código R para usar el paquete MATRIX?  ( Converting r code snippet to use the matrix package ) 
No estoy seguro de que hay otros usuarios por ahí, pero en caso de: Soy un novato en R y fue amablemente "entregado" el siguiente fragmento de código R: ...

17  Multiplicando las matrices escasas y densas adormecidas y densas de manera eficiente  ( Multiplying numpy scipy sparse and dense matrices efficiently ) 
Estoy trabajando para implementar la siguiente ecuación: Set test = Server.CreateObject("TestNamespace.TestClass") test.TestMethod("test string") Set test ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos