Usando iej como variáveis ​​no Matlab

142

ie jsão nomes de variáveis ​​muito populares (veja, por exemplo, esta pergunta e esta ).

Por exemplo, em loops:

for i=1:10,
    % do something...
end

Como índices na matriz:

mat( i, j ) = 4;

Por que eles não deveriam ser usados ​​como nomes de variáveis ​​no Matlab?

Shai
fonte
5
É claro que não vou denunciá-lo como tal, mas, a julgar pelas respostas, eu diria que isso é "principalmente baseado em opiniões". ;-) Eu pessoalmente não iria desistir i, j, kcomo os nomes de variáveis de loop genéricos.
A.Delda
1
@ A.Donda bem, esta é a sua opinião;)
Shai
@Shai, esta é sua última frase nesta pergunta: "Por que eles não deveriam ser usados ​​como nomes de variáveis ​​no Matlab?" Portanto, não está muito claro por que você rejeita minha edição em sua pergunta ?! Alterei seu título para um título mais construtivo "Por que NÃO devo usar
iej

Respostas:

176

Porque ie jsão as duas funções que denotam a unidade imaginária :

Portanto, uma variável chamada iou jirá substituí-los, potencialmente silenciosamente quebrando código que faz matemática complexa.

As soluções possíveis incluem usar iie jjcomo variáveis ​​de loop ou usar 1isempre que inecessário para representar a unidade imaginária.

Oliver Charlesworth
fonte
42
Também é digno de nota que, mesmo se você não está quebrando nada, o tempo de execução ainda é sacrificada para resolver os ie jvariável nomes.
Eitan T
14
@Eitan: Você pode realmente apoiar isso de uma maneira concreta e conclusiva em uma versão compilada pelo JIT do Matlab? Eu nunca achei que fosse o caso (e testes simples chamando um forloop 1 bilhão de vezes não mostram diferença estatística no tempo). Pelo que sabemos, existe um código especial para lidar exatamente com isso e o uso de variáveis ​​diferentes de ie j(e k?) É realmente um pouco mais lento. E as diferenças que existem são minúsculas ou inexistentes na vida real. Simplesmente não há razão para NÃO usar ie jcomo variáveis ​​regulares - elas apenas precisam ser usadas corretamente como qualquer outra função do Matlab.
horchler
5
@horchler Bem, os documentos oficiais declaram aqui que a substituição de classes de dados padrão do MATLAB "pode ​​afetar negativamente o desempenho", e aqui está implícito evitar a substituição de constantes complexas por razões de velocidade e robustez. Nos documentos antigos do R2009b , é explicitamente recomendado substituir as constantes complexas, pois isso pode impedir a aceleração do JIT. A resolução de nomes variáveis ​​é talvez minúscula, mas pode ser significativa se repetida milhões de vezes.
Eitan T
14
Nas versões antigas do Matlab, talvez. Eu costumava ver isso sozinho. Mas não mais com R2012a + (OS X) pelo menos. E não vi diferença ao chamar um forloop 1 bilhão de vezes e tentar todos os tipos de esquemas de temporização. Estou vendo que novos usuários de SO são informados de que um código perfeitamente válido está errado porque eles estão usando ie jpara repetir loops. Francamente, é bobagem e as pessoas estão perdendo o ponto mais importante dessa pergunta: isso inem jdeveria ser usado para a unidade imaginária, se alguém quiser escrever um código Matlab moderno e legível.
horchler
12
minha maior economia de tempo é ao pesquisar ii. Procurando por eu posso ser uma verdadeira dor
craq
62

É uma boa prática evitar ie jvariáveis ​​para evitar confusão sobre serem variáveis ​​ou a unidade imaginária.

Pessoalmente, porém, eu uso ie jcomo variáveis ​​com bastante frequência o índice de loops curtos. Para evitar problemas no meu próprio código, sigo outra boa prática a respeito ie j: não os use para indicar números imaginários. De fato, a documentação do Matlab afirma :

Para velocidade e robustez aprimorada, você pode substituir o complexo ie o jpor 1i.

Portanto, em vez de evitar dois nomes de variáveis ​​muito comumente usados ​​por causa de um conflito em potencial, sou explícito sobre números imaginários. Isso também torna meu código mais claro. Sempre que vejo 1i, sei que representa sqrt(-1)porque não poderia ser uma variável.

sapatilha
fonte
2
É de fato uma boa prática usar 1i. No entanto, alterar o significado ie jpode levar a erros difíceis de depurar, como este .
Shai
1
@Shai Bom ponto. Ajustei minha resposta para reconhecer que é o melhor ie evitar j, mas expliquei como meu estilo de codificação pessoal não segue essa regra.
shoelzer
2
Note-se que a velocidade mencionado não parece ser muito significativo: stackoverflow.com/questions/18163454/...
Dennis Jaheruddin
Concordo plenamente! A boa prática é SEMPRE usar 1ie não ipara matemática complexa. Vamos pensar no número imaginário como 1ie tomar icomo número imaginário uma má prática. Não o contrário. Usando i, ii, iiié prática comum em Matlab e não há nenhum problema quando as pessoas ficar com 1ie 1jpara o número complexo. Além disso, o Matlab respeita isso e este não diminui o desempenho (tanto quanto eu testei), como indicado na resposta anterior.
SdidS
iej não devem ser usados ​​de qualquer maneira - esses números significam algo - use um nome que descreva a finalidade (row_n, elementNo, listItemIndex, etc.). É muito mais fácil para alguém entender o que você está fazendo, depurar etc. O tempo extra gasto vale mais que o ganho em manutenção de longo prazo, para qualquer coisa além de um script descartável - mesmo com o Matlab Editor bem atrás maioria dos outros IDEs modernos.
LightCC 13/08/19
27

Nas versões antigas do MATLAB, costumava haver um bom motivo para evitar o uso de ie jcomo nomes de variáveis ​​- as versões anteriores do MATLAB JIT não eram suficientemente inteligentes para saber se você as estava usando como variáveis ​​ou como unidades imaginárias, e portanto desative muitas otimizações possíveis.

Seu código, portanto, ficaria mais lento apenas pela presença ie jcomo variáveis, e aceleraria se você as alterasse para outra coisa. É por isso que, se você ler muitos códigos do MathWorks, verá iie será jjusado amplamente como índices de loop. Por um tempo, o MathWorks pode até ter aconselhado não oficialmente as pessoas a fazerem elas mesmas (embora elas sempre aconselhem oficialmente as pessoas a programarem por elegância / manutenção, em vez de fazer o que o JIT atual faz, pois é um alvo móvel em cada versão).

Mas isso já faz muito tempo, e hoje em dia é uma questão de "zumbi" que é realmente muito menos importante do que muitas pessoas ainda pensam, mas se recusa a morrer.

Em qualquer versão recente, é realmente uma preferência pessoal usar iou jcomo nomes de variáveis ​​ou não. Se você trabalha muito com números complexos, convém evitar, ie jcomo variáveis, evitar qualquer pequeno risco potencial de confusão (embora você também queira / em vez disso use apenas 1iou 1jainda menos confusão e desempenho um pouco melhor) )

Por outro lado, em meu trabalho típico, nunca lido com números complexos e acho meu código mais legível se me sentir livre para usar ie jcomo índices de loop.


Eu vejo muitas respostas aqui que dizem: Não é recomendado ... sem dizer quem está fazendo isso. Aqui está a extensão das recomendações reais do MathWorks, a partir da documentação atual para i:

Como i é uma função, ela pode ser substituída e usada como uma variável. No entanto, é melhor evitar o uso de iej para nomes de variáveis ​​se você pretende usá-los em aritmética complexa. [...] Para velocidade e robustez aprimorada, você pode substituir o complexo iej por 1i.

Sam Roberts
fonte
15

Conforme descrito em outras respostas, o uso de icódigo geral não é recomendado por dois motivos:

  • Se você deseja usar o número imaginário, ele pode ser confundido ou substituído por um índice
  • Se você usá-lo como um índice, ele pode sobrescrever ou ser confundido com o número imaginário

Como sugerido: 1ie iisão recomendados. No entanto, embora esses dois desvios sejam excelentes i, não é muito bom usar essas duas alternativas juntas.

Aqui está um exemplo do porquê (pessoalmente) eu não gosto:

val2 = val + i  % 1
val2 = val + ii % 2
val2 = val + 1i % 3

Um não será facilmente interpretado mal por dois ou três, mas dois e três se assemelham.

Portanto, minha recomendação pessoal seria: Caso você às vezes trabalhe com código complexo, use sempre 1icombinado com uma variável de loop diferente.

Exemplos de índices de uma única letra que, para se você não usar muitas variáveis de laço e letras bastam: t, u, kep

Exemplo de índices mais longos: i_loop, step, walk, et_now

É claro que isso também é uma questão de gosto pessoal, mas não deve ser difícil encontrar índices de uso que tenham um significado claro, sem crescer muito.

Dennis Jaheruddin
fonte
1
1i denota a unidade imaginária (também Matlab variáveis nomes não podem começar com um número)
lib
2
@DennisJaheruddin: plugue descarado: use minha sintaxe do MATLAB, destacando o script de usuário do Stack Overflow. No último exemplo, 1ivai ser de cor diferente como um número :)
Amro
2
Diretamente de doc ie doc j: "Para velocidade e robustez aprimorada, você pode substituir o complexo iej por 1i." Na IMO, no Matlab atual, não há razão para não usar ie jem loops, etc., ou usar algo diferente de 1idenotar a unidade imaginária ( 1jfunciona também). A única exceção é ao passar seqüências de caracteres para o mecanismo simbólico sempre um pouco incompatível. Estranho que help 1ie doc 1inão funciona embora.
horchler
11

Foi apontado que 1ié uma maneira aceitável e inequívoca de escrever sqrt(-1), e que, como tal, não há necessidade de evitar o uso i. Por outro lado, como Dennis apontou ( https://stackoverflow.com/a/14893729/1967396 ), pode ser difícil ver a diferença entre 1ie ii. Minha sugestão: use 1jcomo constante imaginária sempre que possível. É o mesmo truque que engenheiros empregam - eles usam jpara sqrt(-1)porque ijá está tomada de corrente .

Pessoalmente eu nunca uso ie j; Eu uso iie jjcomo variáveis ​​de indexação abreviada (e kk, ll, mm, ...) e 1jquando preciso usar números complexos.

Floris
fonte
2
"pode ​​ser difícil ver a diferença entre 1ie ii" E ainda mais a diferença entre 1e le entre Oe 0. É por isso que a primeira etapa que eu faço em uma nova instalação do MATALB é alterar o tamanho da fonte padrão.
glglgl
6

A confusão com a unidade imaginária foi bem abordada aqui, mas há outras razões mais prosaicas pelas quais esses e outros nomes de variáveis ​​de letra única são algumas vezes desencorajados.

  1. MATLAB especificamente: se você estiver usando o codificador para gerar a fonte C ++ a partir do seu código MATLAB (não, é horrível), será explicitamente avisado para não reutilizar variáveis ​​devido a possíveis conflitos de digitação.

  2. Geralmente, e dependendo do seu IDE, um nome de variável de uma letra pode causar estragos nos marcadores e pesquisar / substituir. O MATLAB não sofre com isso e acredito que o Visual Studio não tenha um problema há algum tempo, mas os padrões de codificação C / C ++ como MISRA etc. tendem a aconselhá-los.

Pela minha parte, evito todas as variáveis ​​de letra única, apesar das vantagens óbvias para implementar diretamente fontes matemáticas. É preciso um pouco de esforço extra nas primeiras centenas de vezes que você faz isso, mas depois disso você para de notar, e as vantagens quando você ou alguma outra alma pobre chega a ler seu código são numerosas.

xenoclast
fonte
4

Qualquer código não trivial contém vários forloops e as práticas recomendadas recomendam o uso de um nome descritivo indicativo de sua finalidade e escopo. Por vezes imemoriais (e menos que seu 5-10 linhas de script que eu não estou indo para salvar), eu sempre têm vindo a utilizar nomes de variáveis como idxTask, idxAnotherTaske idxSubTasketc.

Ou, no mínimo, dobrando a primeira letra da matriz que está indexando, por exemplo , ssindexar subjectList, ttindexar taskList, mas não iiou jjque não me ajuda a identificar sem esforço qual matriz eles estão indexando do meu múltiplo para loops.

Pradeep Reddy Raamana
fonte
3

Por padrão ie jdefina a unidade imaginária. Portanto, do ponto de vista do MATLAB, usar icomo variável é como usar 1como variável.

yo '
fonte
5
Eu não acho que seja assim. i é um nome de variável legítimo, para que você possa realmente usar iej como nomes de variáveis. como uma resposta anterior menciona, mascarará o significado imaginário. 1 não é um nome de variável legítimo. é totalmente bom se você nunca usar números complexos.
9133 thang
Thang @ é por isso que eu disse "de alguma forma como" e não "como". Eu sei que há uma diferença. A OP perguntou por que eles não deveriam ser usados. Tentei explicar que é porque eles já expressam um número.
yo '
2
ok, desculpe, eu não sei o que de alguma forma significa. para mim é claramente diferente, porque bem, você não pode usar 1 como uma variável, mesmo se você quisesse ... mas eu vejo de onde você vem.
thang
você pode usá-los, como também pode usar nomes de funções existentes para variáveis ​​(e ao mesmo tempo corromper essas funções / constantes internas para uso posterior). Se você realmente quer que é outra coisa (resposta imo simples: não)
Gunther Struyf
1
Desculpe, mas esta explicação não faz sentido. As funções ie jsão realmente retornando o valor da unidade imaginária. É possível usar uma variável com o mesmo nome que uma função em um escopo. No entanto, isso sombreará a função.
31415 patrik
2

A menos que você é um usuário muito confuso Eu acho que existe muito pouco risco na utilização de nomes de variáveis i e j e eu usá-los regularmente. Não vi nenhuma indicação oficial de que essa prática deva ser evitada.

Embora seja verdade que a sombra da unidade imaginária possa causar alguma confusão em algum contexto, como mencionado em outras postagens, no geral, simplesmente não a vejo como um problema importante. Há muito mais coisas confusas que você pode fazer no MATLAB, por exemplo, definirfalse=true

Na minha opinião, o único momento em que você provavelmente deve evitá-los é se o seu código lida especificamente com números imaginários.

Gregswiss
fonte
Você pode comentar quando fizer uma votação insuficiente. Por exemplo, com um link do Mathworks indicando que a prática não é recomendada (que foi declarada por vários pôsteres sem referenciar nenhuma diretriz oficial). De fato, o uso de 'i' em loops está sendo usado em exemplos oficiais pelo Mathworks. Na minha experiência, torna o código claro e conciso e é uma prática muito comum.
gregswiss
1
Citando a documentação "Desde que ié uma função, ele pode ser substituído e usado como uma variável. No entanto, é melhor evitar o uso ie jpara nomes de variáveis, se você pretende usá-los em aritmética complexa." Que, em conjunto com o comentário de Eitan T sobre a resposta de Oliver (acho que ele cronometrou), parece prova suficiente.
Adriaan
1
Observe também que já existe uma resposta de 2013 com o comentário mencionado por @Adriaan.
Andras Deak
1
portanto, a documentação declara SE você pretende usar em aritmética complexa, caso contrário isso não se aplica - não sei por que todo mundo é tão exigente com isso aqui! Eu estava apenas oferecendo um ponto de vista alternativo.
gregswiss