suptitle font matlab matrix

font - title position matlab



Diferencia entre[] y[1x0] en MATLAB (4)

Tengo un ciclo en MATLAB que llena una matriz de celdas en mi espacio de trabajo (2011b, Windows 7, 64 bit) con las siguientes entradas:

my_array = [1x219 uint16] [ 138] [1x0 uint16] <---- row #3 [1x2 uint16] [1x0 uint16] [] <---- row #6 [ 210] [1x7 uint16] [1x0 uint16] [1x4 uint16] [1x0 uint16] [ 280] [] [] [ 293] [ 295] [1x2 uint16] [ 298] [1x0 uint16] [1x8 uint16] [1x5 uint16]

Tenga en cuenta que algunas entradas tienen [] , como en la fila #6 , mientras que otras contienen [1x0] elementos, como en la fila #3 .

  1. ¿Hay alguna diferencia entre ellos? (aparte del hecho de que MATLAB los muestra de manera diferente). ¿Alguna diferencia en cómo MATLAB los representa en la memoria?
  2. Si la diferencia es solo acerca de cómo MATLAB los representa internamente, ¿por qué debería el programador ser consciente de esta diferencia? (es decir, ¿por qué mostrarlos de manera diferente?). ¿Es un error (inofensivo)? ¿o hay algún beneficio en saber que tales arreglos están representados de manera diferente?

Cuando se concatenan matrices, la dimensión común tiene que coincidir.

Actualmente no es un error si no coincide cuando uno de los operandos está vacío, pero se recibe una desagradable advertencia de que las versiones futuras podrían ser más estrictas.

Ejemplos:

>> [ones(1,2);zeros(0,9)] Warning: Concatenation involves an empty array with an incorrect number of columns. This may not be allowed in a future release. ans = 1 1 >> [ones(2,1),zeros(9,0)] Warning: Concatenation involves an empty array with an incorrect number of rows. This may not be allowed in a future release. ans = 1 1


En la mayoría de los casos (ver a continuación una excepción), no hay una diferencia real. Ambos se consideran "empty" , ya que al menos una dimensión tiene un tamaño de 0. Sin embargo, no lo llamaría un error, ya que como programador es posible que desee ver esta información en algunos casos.

Digamos, por ejemplo, que tienes una matriz 2-D y quieres indexar algunas filas y algunas columnas para extraerlas en una matriz más pequeña:

>> M = magic(4) %# Create a 4-by-4 matrix M = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 >> rowIndex = [1 3]; %# A set of row indices >> columnIndex = []; %# A set of column indices, which happen to be empty >> subM = M(rowIndex,columnIndex) subM = Empty matrix: 2-by-0

Tenga en cuenta que el resultado vacío todavía le dice cierta información, específicamente que trató de indexar 2 filas de la matriz original. Si el resultado acaba de mostrar [] , no sabría si estaba vacío porque los índices de sus filas estaban vacíos, o los índices de sus columnas estaban vacíos, o ambos.

La advertencia ...

Hay algunos casos en los que una matriz vacía definida como [] (es decir, todas sus dimensiones son 0) puede proporcionarle resultados diferentes que una matriz vacía que todavía tiene algunas dimensiones distintas de cero. Por ejemplo, la multiplicación de matrices puede proporcionarle resultados diferentes (y algo no intuitivos) cuando se trata de diferentes tipos de matrices vacías. Consideremos estas 3 matrices vacías:

>> a = zeros(1,0); %# A 1-by-0 empty matrix >> b = zeros(0,1); %# A 0-by-1 empty matrix >> c = []; %# A 0-by-0 empty matrix

Ahora, intentemos multiplicarlos de diferentes maneras:

>> b*a ans = [] %# We get a 0-by-0 empty matrix. OK, makes sense. >> a*b ans = 0 %# We get a 1-by-1 matrix of zeroes! Wah?! >> a*c ans = Empty matrix: 1-by-0 %# We get back the same empty matrix as a. >> c*b ans = Empty matrix: 0-by-1 %# We get back the same empty matrix as b. >> b*c ??? Error using ==> mtimes Inner matrix dimensions must agree. %# The second dimension of the first %# argument has to match the first %# dimension of the second argument %# when multiplying matrices.

Obtener una matriz no vacía multiplicando dos matrices vacías es probablemente suficiente para que te duela la cabeza, pero tiene sentido, ya que el resultado todavía no contiene nada (es decir, tiene un valor de 0).


Otra diferencia está en la representación interna de ambas versiones de vacío. Especialmente cuando se trata de agrupar objetos de la misma clase en una matriz.

Digamos que tienes una clase ficticia:

classdef A < handle %A Summary of this class goes here % Detailed explanation goes here properties end methods end end

Si intenta iniciar una matriz desde vacío y convertirla en una matriz de objetos A:

clear all clc % Try to use the default [] for an array of A objects. my_array = []; my_array(1) = A;

Entonces obtienes:

??? The following error occurred converting from A to double: Error using ==> double Conversion to double from A is not possible. Error in ==> main2 at 6 my_array(1) = A;

Pero si lo haces:

% Now try to use the class dependent empty for an array of A objects. my_array = A.empty; my_array(1) = A;

Entonces todo está bien.

Espero que esto se agregue a las explicaciones dadas anteriormente.


Si la concatenación y la multiplicación no son suficientes para preocuparse, todavía hay bucles. Aquí hay dos maneras de observar la diferencia:

1. Bucle sobre el tamaño variable

for t = 1:size(zeros(0,0),1); % Or simply [] ''no'' end for t = 1:size(zeros(1,0),1); % Or zeros(0,1) ''yes'' end

Se imprimirá ''yes'' , si reemplaza el size por la length , no imprimirá nada en absoluto.

Si esto no es una sorpresa, tal vez el próximo será.

2. Iterar una matriz vacía usando un bucle for

for t = [] %// Iterate an empty 0x0 matrix 1 end for t = ones(1, 0) %// Iterate an empty 1x0 matrix 2 end for t = ones(0, 1) %// Iterate an empty 0x1 matrix 3 end

Se imprimirá:

ans = 3

Para concluir con una respuesta concisa a sus dos preguntas:

  • Sí, definitivamente hay una diferencia entre ellos
  • De hecho, creo que el programador se beneficiará al conocer esta diferencia, ya que la diferencia puede producir resultados inesperados